我有一个包含多个 ImageViews
的应用程序是可点击的。所有这些图像都在 LinearLayout
中.
我实现了一个 OnTouchListener
并将其设置为 LinearLayout
.当我滑过它时,我的 OnTouchListener
调用函数。
问题是如果我开始滑过 ImageViews
没有 OnClickListener
OnTouchListener
有效,但是当我开始滑动具有 OnClickListener
的图像时, 然后是 OnTouch
函数不起作用(OnClick
的 ImageView
也不起作用,因为它是正常的)。
我想知道是否有办法让我的 ImageViews
有 onClick
如果用户滑动而不是点击,则将操作传递给下面的 View ,如果用户只是点击,则不传递它。
提前致谢
最佳答案
我设法做到了,我找到的唯一方法是使用 SimpleOnGestureListener。如果有人遇到同样的问题,我会复制粘贴代码。
像这样创建一个类:
public abstract class MyGestureDetector extends SimpleOnGestureListener {
private static final int SWIPE_MIN_DISTANCE = 100;
private static final int SWIPE_THRESHOLD_VELOCITY = 50;
private GestureDetector gestureDetector;
private View.OnTouchListener gestureListener;
private Activity activity;
public MyGestureDetector(Activity activity) {
this.activity = activity;
gestureDetector = new GestureDetector(this);
gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
};
}
public abstract void onRightToLeftSwipe();
public abstract void onLeftToRightSwipe();
public abstract void onTopToBottomSwipe();
public abstract void onBottomToTopSwipe();
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velX,
float velY) {
DisplayMetrics dm = activity.getResources().getDisplayMetrics();
int REL_SWIPE_MIN_DISTANCE = (int) (SWIPE_MIN_DISTANCE * dm.densityDpi / 160.0f);
int REL_SWIPE_THRESHOLD_VELOCITY = (int) (SWIPE_THRESHOLD_VELOCITY
* dm.densityDpi / 160.0f);
float deltaX = e1.getX() - e2.getX();
float deltaY = e1.getY() - e2.getY();
try {
// swipe horizontal?
if ((Math.abs(deltaX) > REL_SWIPE_MIN_DISTANCE)
&& (Math.abs(velX) > REL_SWIPE_THRESHOLD_VELOCITY)
&& (Math.abs(deltaX) > Math.abs(deltaY))) {
// left or right
if (deltaX < 0) {
this.onLeftToRightSwipe();
return true;
}
if (deltaX > 0) {
this.onRightToLeftSwipe();
return true;
}
} else if ((Math.abs(deltaY) > REL_SWIPE_MIN_DISTANCE)
&& (Math.abs(velY) > REL_SWIPE_THRESHOLD_VELOCITY)) { // swipe
// vertical
// top or down
if (deltaY < 0) {
this.onTopToBottomSwipe();
return true;
}
if (deltaY > 0) {
this.onBottomToTopSwipe();
return true;
}
} else {
return false; // We don't consume the event
}
} catch (Exception e) {
// nothing
}
return false;
}
public View.OnTouchListener getGestureListener() {
return gestureListener;
}
public void setGestureListener(View.OnTouchListener gestureListener) {
this.gestureListener = gestureListener;
}
}
然后你必须在你的 Activity 中这样做:
public void onCreate(Bundle savedInstanceState) {
// Initializate your variables here
// Using Gestures
MyGestureDetector gestos = new MyGestureDetector(this) {
@Override
public void onTopToBottomSwipe() {
// Do whatever
}
@Override
public void onRightToLeftSwipe() {
// Do whatever
}
@Override
public void onLeftToRightSwipe() {
// Do whatever
}
@Override
public void onBottomToTopSwipe() {
// Do whatever
}
};
最后但并非最不重要的一点是,您必须将 TouchListener 置于您想要在其中滑动的布局以及该布局中可点击的每个 View
layoutSwipe = (LinearLayout) findViewById(R.id.layoutSwipe);
layoutSwipe.setOnTouchListener(gestos.getGestureListener());
viewInsidells.setOnTouchListener(gestos.getGestureListener());
view2Insidells.setOnTouchListener(gestos.getGestureListener());
有了这个,你可以在你的布局中使你的 View 可点击,如果你点击它只会执行你点击的 View 的点击操作,如果你滑动它只会根据你的移动执行滑动操作。
我花了 4 个小时试图解决这个问题,希望我能节省一些时间到下一个。
关于android - OnClick 抑制下面的 OnTouch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12843965/