当用户点击ImageButton
我尝试创建一个实现 OnClickListener
和OnTouchListener
的静态类时,我需要做点什么
static class ClickListenerForScrolling implements OnClickListener, OnTouchListener
具有以下方法:
@Override
public void onClick(View v)
和
@Override
public boolean onTouch(View arg0, MotionEvent arg1)
这背后的整个想法是在用户触摸它时更改ImageButton
的图像源,并在用户单击此按钮时执行任务。任何人都可以给我一个如何做到这一点的提示吗?
答案 0 :(得分:35)
由于这两个动作都包含手势“将手指放在屏幕上 - 从屏幕抬起手指”,因此您无法确定是触摸动作还是点击动作。因此,如果您在此图像按钮上实现两个侦听器,则触摸/单击将更改图片并按下按钮。不确定这些事件是否有确定的顺序......
但是,如果要分离这些事件,则需要为其中一个操作定义不同的手势(例如擦除以更改图片),或创建处理事件的不同区域,例如图像不不适合整个按钮,自由区域用作按钮点击区域。
HTH
<强>更新强>
我发现,TouchEvent
比ClickEvent
更通用,因此首先调用它。
public abstract boolean onTouch (View v, MotionEvent event)
如果侦听器已使用该事件,则返回true,否则返回false。
因此,您可以在实现中决定是否也应该通过OnClickListener处理事件,然后返回false
。
答案 1 :(得分:12)
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
然后有一个点击,否则根据手势它会多于或少于零。
因此,这是在没有实际点击事件的情况下使用点击事件并仅使用onTouchListener
的方法。
希望会很有用。
答案 2 :(得分:10)
使用此代码:
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));
答案 3 :(得分:4)
使用return false
代替return true
答案 4 :(得分:1)
有很多解决此问题的方法,对我来说最好的方法是完全消除setOnClickListener,然后在onTouchListener内检查该动作是否为ACTION_UP,然后在该动作内检查之前的最后一个是否为ACTION_DOWN:
case MotionEvent.ACTION_UP:
if (lastAction == MotionEvent.ACTION_DOWN) {
//code for click
.
.
lastAction = event.getAction();
}
lastAction为int,我在每个ACTION的末尾对其进行更新