2013-06-07 5 views
2

Раскладка как:Как направить события прикосновения к детям после употребления

enter image description here

View 1 является самостоятельной определено расположение FlipperLayout и View 2 является расширенной ListView PinnedHeaderListView, который я хочу добавить функция «pull to refresh». Просмотр 1 нужно прослушать событие касания, чтобы перевернуть влево или вправо. Для просмотра 2 также требуется событие касания. И проблема в том, что если View 1 потребляет событие touch, View 2 не может его получить.

Как я могу отправить мероприятие на просмотр 2 даже после просмотра 1 из них?

+0

какие мероприятия вы хотите отправить на просмотр2? – pskink

+0

@pskink Я хочу слушать жест, так что в основном мне нужны ACTION_DOWN, ACTION_MOVE, ACTION_UP – zoujyjs

+0

нормально, но почему события, которые произошли в view1, должны быть переданы в view2? – pskink

ответ

0

Прикосновение событие возвращает логическое значение, определяющее, если событие было потреблено или нет, просто возвращает ложь, и событие будет продолжать туннелю детей рассматривает

+3

Нет, это верно только для первого события ACTION_DOWN. Следующие ACTION_MOVE и ACTION_UP будут напрямую отправляться в тот, который возвращает true (в этом случае это должно быть представление 2). Так что басически, если вы просто вернете false в родительском, вы можете захватить ACTION_DOWN в представлении родителя и ребенка. Но вы не можете захватить других в родительском, но только в дочернем представлении 2. Вот где проблема. – zoujyjs

1

рассмотрим следующий пользовательский макет:

class FlingLinearLayout extends LinearLayout { 

    private GestureDetector mDetector; 

    public FlingLinearLayout(Context context) { 
     super(context); 
     setOrientation(LinearLayout.VERTICAL); 
     OnGestureListener listener = new SimpleOnGestureListener() { 
      @Override 
      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
       Log.d(TAG, "onFling vx: " + velocityX + ", vy: " + velocityY); 
       if (Math.abs(velocityX) > Math.abs(velocityY)) { 
        String text = (velocityX > 0? "left to right" : "right to left") + " fling"; 
        Toast.makeText(getContext(), text, Toast.LENGTH_LONG).show(); 
        return true; 
       } 
       return false; 
      } 
     }; 
     mDetector = new GestureDetector(context, listener); 
     setBackgroundColor(0xaaff0000); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     //Log.d(TAG, "onTouchEvent " + event); 
     // handle own events (initiated in red area) 
     mDetector.onTouchEvent(event); 
     return true; 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     //Log.d(TAG, "onInterceptTouchEvent " + ev); 
     // handle child events 
     // note: if you horizontally fling over button its onClick() is not performed 
     return mDetector.onTouchEvent(ev); 
    } 
} 

и его использование в вашей деятельности:

ViewGroup ll = new FlingLinearLayout(this); 
Button b; 
OnClickListener l = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Button b = (Button) v; 
     Log.d(TAG, "onClick " + b.getText()); 
    } 
}; 
b = new Button(this); 
b.setText("first"); 
b.setOnClickListener(l); 
ll.addView(b); 
b = new Button(this); 
b.setText("second"); 
b.setOnClickListener(l); 
ll.addView(b); 
b = new Button(this); 
b.setText("third"); 
b.setOnClickListener(l); 
ll.addView(b); 
setContentView(ll); 
+0

хорошая точка при возврате mDetector.onTouchEvent (ev); in onInterceptTouchEvent – Vilen

Смежные вопросы