2014-04-06 5 views
1

В вертикальном ListView, который также нужно выполнять перетаскивание в горизонтальном направлении, я слушаю события ACTION_MOVE, ища соответствующий deltaX. Он работает правильно, если ListView также не начнет прокручивать по вертикали. Как только он начинает делать это, он потребляет события перемещения, и мой обработчик перетаскивания не получает шанса.Поделитесь событиями касания в 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; 
    } 
}); 

Bog стандарт. Он работает, когда пользователь перемещается горизонтально, появляются ACTION_MOVE, перетаскивание начинается, когда это необходимо. Это происходит не тогда, когда пользователь также перемещается по вертикали, даже если это немного, потому что ListView перехватывает все ACTION_MOVE во время прокрутки, и я никогда не получаю deltaX достаточно большой, чтобы начать фактическую операцию перетаскивания.

+0

, так что вы хотите перетащить n drop _while_, список прокрутки? – kiruwka

+0

Да. Я хочу начать перетаскивание, если deltaX достаточно велик, независимо от того, есть или нет вертикальная прокрутка в одно и то же время. Чтобы визуализировать, представьте, что список содержит небольшие изображения. Я хочу, чтобы его можно было перетащить в центр экрана. И я хочу, чтобы это можно было сделать, даже если изображение, с которого начинается пользователь, не смежно с центром экрана, но выше или ниже, поэтому движение движения от изображения к центру экрана также будет иметь вертикальный компонент. –

+0

Почему вы не вызываете [startDrag] (http://developer.android.com/reference/android/view/View.html#startDrag), когда вы решите начать перетаскивание, как описано в [учебнике по android] (http : //developer.android.com/guide/topics/ui/drag-drop.html) – kiruwka

ответ

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); 
    } 
} 
Смежные вопросы