Подтвердить что ты не робот

Как объединить OnClickListener и OnTouchListener для ImageButton

Мне нужно что-то сделать, когда пользователь нажимает кнопку ImageButton Я пытался создать статический класс, который реализует как OnClickListener, так и OnTouchListener

static class ClickListenerForScrolling implements OnClickListener, OnTouchListener 

который имеет следующие методы:

@Override
public void onClick(View v)

и

@Override
public boolean onTouch(View arg0, MotionEvent arg1)

Вся эта идея заключается в том, чтобы изменить источник изображения ImageButton, когда пользователь коснется его, и выполнить задачу, когда пользователь нажмет эту кнопку. Может ли кто-нибудь дать мне подсказку о том, как это сделать?

4b9b3361

Ответ 1

Так как оба действия состоят из жестов "потяните палец на экран - поднимите палец с экрана", вы не можете определить, было ли это касанием или действием щелчка. Поэтому, если вы реализуете оба прослушивателя на этой кнопке изображения, сенсорный/клик изменит изображение и нажмите кнопку. Не уверен, есть ли определенный порядок этих событий...

Однако, если вы хотите отделить эти события, вам нужно будет либо определить другой жест одному из действий (например, стирать для изменения изображения), либо создать разные области, которые обрабатывают события, например, изображение не работает 't подходит для всей кнопки, и свободная область служит в качестве области нажатия кнопки.

НТН

Update:

Я понял, что a TouchEvent более общий, чем a ClickEvent, поэтому он вызывается первым.

public abstract boolean onTouch (View v, MotionEvent event)

Это возвращает true, если слушатель потребляет событие, иначе false. Таким образом, вы можете решить в своей реализации, если событие должно также обрабатываться OnClickListener, а затем просто вернуть false.

Ответ 2

onTouchListener способен обрабатывать оба движения.

Switch между значениями event.action() для получения MotionEvent.

case MotionEvent.ACTION_DOWN: это первый удар пальцем.
case MotionEvent.ACTION_UP: это когда палец уходит.

Вам нужно установить точку удара на ACTION_DOWN.

TheImpactPoint=event.getX();

И затем получите расстояние с помощью ACTION_UP

float distance =TheImpactPoint-event.getX();

If distance = 0, тогда есть щелчок, иначе он будет больше или меньше нуля в зависимости от жестов.

Таким образом, это способ использовать событие click без реального события click и использовать только onTouchListener.

Надеюсь, что это будет полезно.

Ответ 3

Используйте этот код:

public class GestureHelper implements OnTouchListener {

private final GestureDetector mGestureDetector;

public GestureHelper(Context context) {
    mGestureDetector = new GestureDetector(context, new GestureListener(this));
}

public void onSwipeRight() {
};

public void onSwipeLeft() {
};

public void onSwipeTop() {
};

public void onSwipeBottom() {
};

public void onDoubleTap() {
};

public void onClick() {
};

@Override
public boolean onTouch(View v, MotionEvent event) {
    return mGestureDetector.onTouchEvent(event);
}

private static final class GestureListener extends SimpleOnGestureListener {

    private static final int SWIPE_THRESHOLD = 100;
    private static final int SWIPE_VELOCITY_THRESHOLD = 100;
    private GestureHelper mHelper;

    public GestureListener(GestureHelper helper) {
        mHelper = helper;
    }

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        mHelper.onClick();
        return true;
    }

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        mHelper.onDoubleTap();
        return true;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        boolean result = false;
        try {
            float diffY = e2.getY() - e1.getY();
            float diffX = e2.getX() - e1.getX();
            if (Math.abs(diffX) > Math.abs(diffY)) {
                if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffX > 0) {
                        mHelper.onSwipeRight();
                    } else {
                        mHelper.onSwipeLeft();
                    }
                }
            } else {
                if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffY > 0) {
                        mHelper.onSwipeBottom();
                    } else {
                        mHelper.onSwipeTop();
                    }
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return result;
    }
}

}

Расширьте этот класс и используйте вот так:

view.setOnTouchListener(new SomeYourGestureHelper(context, someParameters));

Ответ 4

Используйте return false вместо return true