在ListView中共享触摸事件

时间:2014-04-06 08:55:16

标签: android listview

在垂直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来开始实际的拖动操作。

1 个答案:

答案 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);
  }
}