2014-10-21 1 views
8

У меня есть требование UX, чтобы пользователь запускал Dialog, долгое нажатие ячейки в GridView.Регистрация UP/CANCEL из диалогового окна при запуске события DOWN из LongPress View

  • При отображении Dialog пользователь должен иметь возможность перемещать их палец/палец по экрану без вызывая UP/CANCEL событие, когда они выходят за пределы GridView клетки.

  • Когда пользователь, наконец, разрывает контакт с экраном - это то, что я ищу, чтобы захватить. GridView, похоже, регистрирует ложные срабатывания для UP/CANCEL, которые мы не видим, используя какие-либо другие виды.

  • Вопрос заключается в том, что первоначальный вид захватывает все события прикосновения, потому что DOWN был захвачен ею.

  • Диалог регистрирует/не видит никаких касаний до тех пор, пока событие UP не будет отображаться с исходного вида.

Я попытался отменить оригинальное сенсорное событие и использование dispatchTouch() и т.д. Нет радости.

Любые идеи?

+0

Не могли бы вы уточнить? я не понимаю, что вы хотите сделать. – TheRedFox

+0

У вас есть вид в действии или фрагменте, который вызывает отображение диалога, когда представление длинно (работает). Пользователь должен иметь возможность отвести свой палец от представления, которое вызвало диалог, но никогда не прерывать контакт с экраном. Когда и только тогда, когда пользователь нарушает контакт с экраном, запускает другое событие. Проблема: при перемещении за пределы исходного вида ACTION_UP и/или ACTION_CANCEL запускаются и никакие касания не регистрируются диалогом (или чем-либо еще), пока пользователь не нарушит контакт с экраном и ретушированием. –

+0

Я сделал что-то подобное без сетки. Пользователь должен долгое нажатие на диалог. Пользователь может перемещать палец (при нажатии) повсюду и когда пользователь забирает диалог пальца, скрывается. Пожалуйста, рассмотрите возможность сделать видео и опубликовать его здесь. Я не понял эту часть (и никакие касания не регистрируются в диалоговом окне (или что-либо еще), пока пользователь не нарушит контакт с экраном и ретушированием.) –

ответ

2

Я использовал что-то подобное в одном из моих проектов.

Присвойте OnTouchListener каждой ячейке вашей сетки и переопределите метод OnTouch.

@Override 
public boolean onTouch(View v, MotionEvent event) { 

boolean isLongPressed; 

int mSwipeSlop = ViewConfiguration.get(context). 
       getScaledTouchSlop(); 

boolean mSwiping; 

switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     handler.postDelayed(mLongPressed, 1000); 
     break; 

    case MotionEvent.ACTION_CANCEL: 
     handler.removeCallbacks(mLongPressed); 
     break; 

    case MotionEvent.ACTION_MOVE: 
     float x = event.getX() + v.getTranslationX(); 
      float deltaX = x - mDownX; 
      float deltaXAbs = Math.abs(deltaX); 
      float y = event.getY() + v.getTranslationY(); 
      float deltaY = Y - mDownY; 
      float deltaYAbs = Math.abs(deltaY); 
      float absDist = Math.sqrt(Math.pow(deltaXAbs, 2) + Math.pow(deltaXAbs, 2)); 
      if (!mSwiping) { 
       if (absDist > mSwipeSlop) { 
        mSwiping = true; 
        handler.removeCallbacks(mLongPressed); 
       } 
      } 
     break; 

    case MotionEvent.ACTION_UP: 
     handler.removeCallbacks(mLongPressed); 
     if (isLongPressed) { 
      // DO ACTION UP 
     } 
     break; 

    default: 
     return false; 
    } 
return true; 
} 

Откройте диалоговое окно в работоспособном mLongPressed, который будет работать, только если пользователь прикоснулся на то же место в течение секунды. Вы можете изменить расстояние, которое он может переместить, и время, которое ему нужно, чтобы нажимать, чтобы зарегистрировать его как долгое нажатие. Тем не менее, я бы рекомендовал использовать getScaledTouchSlop() для расстояния.

final Handler handler = new Handler(); 
Runnable mLongPressed = new Runnable() { 
    public void run() { 
     // OPEN DIALOG 
     isLongPressed = true; 
    } 
}; 

Используя этот код в моем проекте, пользователь может перемещать палец по всему экрану без срабатывания ACTION_UP. Только когда он поднимает свой палец, он срабатывает.