Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Как обработать клик только на видимом изображении виджета

#android


Видел много приложений, где при нажатии на разные элементы, будь то домик или дерево,
выполняется определенное действие. Это ведь невидимая кнопка в форме этого объекта?
Или как это вообще реализовано?
    


Ответы

Ответ 1



Для решения вашей проблемы нужно переопределить метод onTouch() для виджета, который будет содержать некоторое изображение, по которому нужно отработать клик. Например, для виджета ImageView: ImageView imgView = (ImageView) findViewById(R.id.imageView); imgView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { final ImageView img = (ImageView) v; final Bitmap bitmap = ((BitmapDrawable) img.getDrawable()).getBitmap(); int x = (int) (event.getX()*bitmap.getWidth()/img.getWidth()); int y = (int) (event.getY()*bitmap.getHeight()/img.getHeight()); int color = bitmap.getPixel(x,y); Log.i("Color",": " + color); return (color == 0) ? true: false; } }); Метод должен возвращать true, чтобы клик игнорировался методом onClick() виджета и false, чтобы регистрировался этим методом. Получить текущие координаты клика можно методами event.getX() и event.getY(), соответственно для горизонтальной и вертикальной оси. Эти координаты будут соответствовать абсолютным координатам на устройстве, с отсчетом от верхнего левого угла виджета. Получить абсолютные размеры исходного изображения можно методами bitmap.getWidth() и bitmap.getHeight(). Получить абсолютные размеры виджета на экране методами img.getWidth() и img.getHeight() В данном примере алгоритм определения, есть ли изображение на кликаемой области основан на том, что получаем Bitmap с назначенным изображением из виджета, затем определяем какой цвет (метод getPixel()) находится в координатах касания. Если прозрачный (color = 0), то отменяем обработку клика, если любой другой, то пропускаем. Вычисления координат производятся по формуле, исходя из того, что Bitmap (исходная картинка) может не соответствовать реальным размерам виджета (например он растянут на полэкрана) и мы приводим координаты касания на виджете, к координатам на реальном изображении. Это только один из примеров, как можно определить касание в определенной области, вы можете реализовать любой свой алгоритм, определяющий, попало ли касание в определенную область на экране или нет. Если аналогичных виджетов будет использоваться несколько, то разумнее будет сделать кастомный View отнаследованный от того же ImageView, к примеру, в котором переопределить метод onTouch().

Ответ 2



Для любой View можно задать background и навешать onClickListener. Будь то ImageView или Button.

Ответ 3



Смотря о чём конкретно идет речь ? Например в TextView прямо в тексте могут находится картинки и т.п. А все дело в том, что на самом деле отображается html - страница, со ссылками нажатие на которые и приводит к действиям

Комментариев нет:

Отправить комментарий