我在HorizontalScrollView中有一些ImageView。
我希望能够将ImageViews拖放到其他地方,但仍然保持滚动功能。只有当用户用手指开始大部分垂直运动时才能激活拖动。
目前,我在长按时拖放了激活,但这不是一个好的解决方案。
说明:
答案 0 :(得分:2)
我也必须做到这一点。阅读http://techin-android.blogspot.in/2011/11/swipe-event-in-android-scrollview.html后,我按如下方式修改了代码:
class MyOnTouchListener implements View.OnTouchListener {
static final int MIN_DISTANCE_Y = 40;
private float downY, upY;
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
downY = event.getY();
return true;
}
case MotionEvent.ACTION_MOVE: {
upY = event.getY();
float deltaY = downY - upY;
// swipe vertical?
if (Math.abs(deltaY) > MIN_DISTANCE_Y) {
if (deltaY < 0) {
//Start your drag here if appropriate
return true;
}
if (deltaY > 0) {
//Or start your drag here if appropriate
return true;
}
}
}
}
return false;
}
}
然后在ImageView
s:
imageView.setOnTouchListener(new MyOnTouchListener());
在这个版本的代码中,我只检查垂直方向的移动(我还将最小移动更改为40而不是原始代码中的100)。如果检测到垂直移动,则特定ImageView
可以开始拖动或执行您想要的任何其他操作。如果未检测到垂直移动,则ImageView
的{{1}}会返回MyTouchListener
,这意味着false
不会消耗触摸事件。这允许父ImageView
最终获得触摸事件并使用它(用于滚动检测)。这里的答案有助于理解触摸事件:MotionEvent handling in ScrollView in Android。