2012-08-28 4 views
18

Android가 터치 이벤트를 처리하는 방법을 이해하려고 시도했지만 조금 혼란스러워했습니다. 터치 이벤트가 루트보기로 보내고 아이들에게 전달되는 것을 이해합니다. Fragment의 컨테이너 인 FrameLayout이 있습니다. 첫 번째 조각보기는 ScrollView이고 두 번째 조각은 Gallery (HorizontalListView) 일종이며, 마지막 조각도 FrameLayout입니다. 매번 레이아웃에 단 하나의 단편. 내가하고 싶은 것은 화면에서 앱 스 와이프를 식별하는 것입니다. 나는 스 와이프를 세고 몇 번의 스 와이프 후에 무언가를하고 싶다. 부모님이 onTouch 이벤트를 잡아서 처리하고 아이들에게 전달하십시오.

나는 정상 FrameLayoutOnTouchListener을 넣어 시도했지만 아이가 ScrollView 또는 Gallery 될 때 호출되지 않습니다. 나는 과 trueonTouch 끝에 넣으려고했으나 같은 결과를 얻었습니다. 결코 호출되지 않습니다.

어떻게하면됩니까? 터치 이벤트를 "투명하게"처리하고 터치하지 않은 채로 전달하려고합니다.

답변

22

제 이해는 실제로 그것이 다른 방향으로가는 것입니다. 자식 뷰는 이벤트가 먼저 발생하도록합니다 (일종의). 루트 뷰 get은 자식을 onTouchEvent()으로 전파하고 true 또는 false를 반환하는지 여부에 따라 부모의 onTouchEvent()이 호출되는 dispatchTouchEvent()이 호출됩니다.

이 같은 것들을 차단에 대한 일반적인 솔루션과 같이 하나의 활동에 dispatchTouchEvent(MotionEvent ev)을 무시하는 것입니다 :이 하나

@Override 
public boolean dispatchTouchEvent (MotionEvent ev) { 
    // Do your calcluations 
    return super.dispatchTouchEvent(ev); 
} 

문서는 here입니다. ViewGroup (FrameLayout 등)의 해당 메소드를 재정의 할 수도 있습니다.

+0

효과가 있습니다. 'FrameLayout'을 확장하고 앞서 언급 한 메서드를 오버로드 한 다음 'MotionEvent'를 GestureDetector에 보냈습니다. 이 주제는 조금 혼란 스럽습니다. 감사! – Elad92

+0

@ Elad92 당신이 언급 한 것처럼 2d 스크롤 코드를 바꿀 수 있습니까? https://gist.github.com/LOG-TAG/0505eedccef9e00821da가 GestureDetector _ –

+0

으로 MotionEvent를 보내는 방법을 얻지 못했습니다.이 http://stackoverflow.com/questions/26354263/catch-ontouch- event-by-custom-2d-scrollview-parent-handle-it-and-passr-childr –

관련 문제