Как объединить 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
, когда пользователь коснется его, и выполнить задачу, когда пользователь нажмет эту кнопку. Может ли кто-нибудь дать мне подсказку о том, как это сделать?
Ответы
Ответ 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