2011-05-09 3 views
4

여러 자녀가있는 ViewGroup이 있다고 가정합니다. 이 ViewGroup에 관해서는 VG라고하는 모든 자식들에 대한 모든 MotionEvent를 관리하도록하고 싶습니다.
1. 대상 (자식)에게 전달하기 전에 모든 이벤트를 가로 챌 수 있습니다.
2. VG는 이벤트를 소비하고 목표 자식에게 이벤트를 추가로 전달할 것인지 결정합니다.
3. DOWN, MOVE, UP, 비교적 독립적 인 것으로 보입니다. VG가 DOWN을 먹을 수는 있지만 MOVE 및 UP을 어린이에게 제공한다는 의미입니다.안드로이드 : ViewGroup, MotionEvent를 가로 채서 대상에 파견하거나 주문형으로 먹는 방법?

SDK 가이드 "Handling UI Event"를 읽었습니다. 이벤트 리스너, 핸들러, ViewGroup.onInterceptTouchEvent (MotionEvent) 및 View.onTouchEvent (MotionEvent)를 알고있었습니다.

여기 SDK 그렇게 말했기 때문에

@Override 
public boolean onInterceptTouchEvent (MotionEvent event) { 
    if (MotionEvent.ACTION_DOWN == event.getAction()) { 
     return true; 
    } 

    return super.onInterceptTouchEvent(event); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (MotionEvent.ACTION_DOWN == event.getAction()) {    
     return true; 
    } 
    else { 
     if (!consumeEvent(event)) { 
      // TODO: dispatch to target since I didn't want to eat event 
      //return this.dispatchTouchEvent(event);  // infinite loop!!! 
     } 
    } 


    return super.onTouchEvent(event); 
} 

, 나는 DOWN 이벤트가 발생한 두 가지 방법 위에서 true를 반환해야 할 몇 가지 이벤트를 먹을 수 있으려면, 내 샘플입니다. 그런 다음 MOVE 및 onTouchEvent를 볼 수 있습니다. 그러나, 제 경우에는 아이들에게 사건을 파견하는 방법에 대해서는 잘 모릅니다.

위의 dispatchTouchEvent는 VG 자체가 대상이 될 수 있기 때문에 이해할 수있는 무한 루프를 발생 시켰습니다. 나는 그 순간에 어떤 타겟이 될지 알 수 없다. MotionEvent는 힌트를주지 않았기 때문에 dispatchTouchEvent는 전혀 쓸모가 없었다.
누구든지 도와주세요. 감사.

+0

수 당신은이 상황에서 내게 도움이된다. [내 문제] (http://stackoverflow.com/questions/13309111/programatically-execute-another-touch-event-when-one-touch-event-occures-in-andr) , 또는 [기타 질문] (http://stackoverflow.com/questions/12980156/detect-touch-event-on-a-view-when-dragged-over-from-other-view) –

답변

4

ViewonInterceptTouchEvent에서 쉽게 찾을 방법이 없으며 이러한 이벤트를 "전달"하는 방법도 없습니다. KeyEvent 초를 파견 할 수 있지만 MotionEvent은 파견 할 수 없습니다.

(예를 들어, 드래그 앤 드롭을위한) MotionEvent의 처리하는 일반적인 방법은 부모 Viewgroup '을 통해 (OnTouchListener을 구현 후 onTouch 콜백을 통해) 다른 View들에 의해 MotionEvent.ACTION_DOWN 이벤트 및 MotionEvent.ACTION_MOVE 이벤트를 처리하는 것입니다 s onInterceptTouchEvent 방법.


그러나 일부 LOC는 여러 단어 이상을 말합니다. 내가 여기에 무슨 말인지의 아주 좋은 예는있다 : http://doandroids.com/blogs/tag/codeexample/


당신이보기 자체에 ACTION_DOWN 이벤트를 처리하는 경우에, 당신은보기 다른 곳에서 시작하는 저장 및 추가 작업을 위해이 변수를 사용할 수 있습니다. 이벤트는 ACTION_UP 또는 ACTION_CANCEL 동작이 완료 될 때까지 동일한보기에 바인딩됩니다. 당신이보기를 추적 유지하고 ACTION_DOWN시 뷰 그룹에 대한 작업을 수행해야하는 경우

는, 나는 당신이 당신의 뷰 그룹의 공용 메소드를 추가하는 것이 좋습니다 (예 : onTouch 콜백에서 호출됩니다 public boolean handleActionDown (View v, MotionEvent e)

+0

감사합니다. DOWN과 부모 VG가 MOVE 또는 UP을 처리하면 필요하다면 여전히 MOVE/UP을 실제 대상으로 보낼 수 없습니다. 어린이의 경우, 처음 DOWN 이벤트가 필요할 때 인터셉트되어야합니다. 그리고 inte 수신 규칙은 모든 DOWN/MOVE/UP에 적용됩니다. 나는 내 사건이 드래그 앤 드롭과 아주 비슷하지 않다고 생각한다. – fifth

+0

@ fifth 댓글에 너무 길기 때문에 나는 내 대답에 대답했다. – Aleadam

+0

오케이, 아이디어를 얻었습니다. 처음에는 대상보기를 저장하는 것이 핵심이며 나중에 나눠 줄 수 있습니다. – fifth