在垂直ListView中,还需要在水平方向上拖放,我正在侦听ACTION_MOVE事件,寻找合适的deltaX。除非ListView也开始垂直滚动,否则它可以正常工作。一旦它开始这样做,它就会消耗移动事件,而我的拖放处理程序也没有机会。
由于两个原因, requestDisallowInterceptTouchEvent()
不是解决方案。首先,我不想禁用滚动,我只想分享移动事件,以便两个处理程序都可以看到它们。其次,我甚至没有达到发布这一点的要点,因为滚动已经消耗了事件,直到达到我的行动水平阈值。
是否有任何可行的解决方案,而不是覆盖和覆盖ListView事件拦截器?
public boolean onTouch(View view, MotionEvent event) {
switch (MotionEventCompat.getActionMasked(event)) {
...
case MotionEvent.ACTION_MOVE:
if (!isDragging) {
float deltaX = Math.abs(downX - event.getX());
if (deltaX > touchSlop) {
isDragging = true;
view.startDrag(...);
}
}
return true;
}
return false;
}
});
沼泽标准。当用户水平移动,ACTION_MOVE进入时,它会起作用,在需要时开始拖动。当用户也垂直移动时,即使只是稍微移动,也不会,因为ListView在滚动期间拦截所有ACTION_MOVE并且我从未得到足够大的deltaX来开始实际的拖动操作。
答案 0 :(得分:1)
public class DraggableListView extends ListView {
private float diffX = 0, diffY = 0;
private float lastX = 0, lastY = 0;
public DraggableListView(Context context) {
super(context, null);
}
public DraggableListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DraggableListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
switch (MotionEventCompat.getActionMasked(event)) {
case MotionEvent.ACTION_DOWN:
diffX = 0;
diffY = 0;
lastX = event.getX();
lastY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
diffX += Math.abs(event.getX() - lastX);
diffY += Math.abs(event.getY() - lastY);
lastX = event.getX();
lastY = event.getY();
if (diffX > diffY)
return false;
}
return super.onInterceptTouchEvent(event);
}
}