ImageView и TouchListener

1

Я пытаюсь сделать кликабельное изображение. На самом деле он доступен для кликов, поэтому я могу вызвать Intent после того, как пользователь коснется изображения. Но я пытаюсь изменить изображение на ощупь.

Я хочу следующее:

  • Значение по умолчанию (без касания): Изображение1
  • Пользователь коснулся изображения: измените изображение2
  • Пользователь перемещается пальцем из изображения: переходите к Image1 (без вызова Intent)
  • Пользователь отключает просмотр изображений: вызовите Intent и вернитесь к Image1

Некоторые из этих функций работают со следующим кодом:

final ImageView v = (ImageView) findViewById(R.id.profileImage);

    v.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View arg0, MotionEvent arg1) {
            switch (arg1.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                   v.setImageResource(R.drawable.ic_contact_picture_down);

                break;
            }


            case MotionEvent.ACTION_CANCEL:{

                v.setImageResource(R.drawable.ic_contact_picture);
                break;

            }

            case MotionEvent.ACTION_UP: {

                takePhoto();

                v.setImageResource(R.drawable.ic_contact_picture);
                break;
            }

            }
            return true;
        }
    });

Изображение правильно изменяется на изображение2. Итак, ACTION_DOWN работает. ACTION_UP вызывается, если пользователь отключает изображение. Но это также называется, если отладка выполняется вне изображения. Если это произойдет, я хочу переключиться на обратный образ1, но не вызывать функцию takePhoto(). ACTION_CANCEL никогда не вызывается, что я считал кандидатом на вышеуказанный случай.

Теги:
imageview
ontouchlistener

1 ответ

0
Лучший ответ

Вы можете попробовать использовать Rect чтобы удерживать границы ImageView а затем использовать ACTION_MOVE

Например, объявите объект Rect,

private Rect rect;

Затем в вашем setOnTouchListener() инициализируйте Rect и проверьте с помощью ACTION_MOVE,

v.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        switch (arg1.getAction()) {
          case MotionEvent.ACTION_DOWN: {
            // Declare the bounds of the rect
            rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());   
            v.setImageResource(R.drawable.ic_contact_picture_down);

            break;
          }

          case MotionEvent.ACTION_MOVE:{
            if(!rect.contains((int)arg1.getX(), (int)arg1.getY())) {
                // Outside the bounds
                v.setImageResource(R.drawable.ic_contact_picture);
            }
            break;        
          }

          case MotionEvent.ACTION_UP: {

            takePhoto();

            v.setImageResource(R.drawable.ic_contact_picture);
            break;
          }
        }
        return true;
    }
});

Извините, я не тестировал это, но думаю, вы можете получить идею :)

  • 0
    Я попытался, и теперь он устанавливает изображение обратно, если я перехожу за пределы изображения. Но все же ACTION_UP вызывается, хотя я не касаюсь за пределами изображения. Так что я просто добавил туда также заявление «если». Работаю сейчас

Ещё вопросы

Сообщество Overcoder
Наверх
Меню