2013-07-24 2 views
4

ActivityGestureDetector을 구현했습니다. 지금 내가처럼 전체 화면에서 모든 이벤트를 잡을 수 onSingleTapConfirmed, onDoubleTap, onLongPress ...GestureDetector와 접촉 한보기 얻기

그것이 누른 내 사용자 지정 레이아웃에서 어떤 View 감지 할 수 있습니까?

답변

1

Android에는 플랫폼 소스 코드가 있으므로 코어 ViewGroups가 구현 된 방법을보고이를 배우는 것이 좋습니다.

ViewGroup의 출처를 살펴 보겠습니다. here. 함수 dispatchTouchEvent()을 찾으십시오. 그것은 당신이하고자하는 것을 꽤 많이합니다.

어떤 뷰가 실제로 탭되었는지를 파악하기 위해 모든 하위 뷰를 반복하고 각 뷰의 히트 니스를 묻고 관련성이 있는지 확인합니다. 코드 :

for (int i = count - 1; i >= 0; i--) { 
    final View child = children[i]; 
    if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE 
     || child.getAnimation() != null) { 
     child.getHitRect(frame); 
     if (frame.contains(scrolledXInt, scrolledYInt)) { 

나는 당신에게 비슷한 것을 제안 할 수 있습니다.

수동 반복 (또는 뷰 내에서보기로 들어가기를 원하기 때문에 반복)을 원하지는 않을 것입니다. 직면하자면, 꽤 역겨운 모양이기 때문입니다. 이 경우 정규 메커니즘이 매력을 갖도록 할 수 있습니다 (일반적으로 이벤트가 하위 뷰로 흐르게하십시오). 그런 다음 처리하려는 특정보기에 이벤트 핸들러를 설정하고 핸들러를 호출하고 어떤보기가 탭되었는지 알립니다.

또 다른 흥미로운 사실은 맞춤 레이아웃이 서브 뷰에 대한 정적 변환을 ViewGroup.setStaticTransformationsEnabled()으로 구현할 수 있다는 것입니다. 3D 뷰 회전식 캐 러셀을 구현할 때 이러한 변환을 사용했습니다. 이 경우, 당신이하고 싶은 것이 불가능하다는 것을 확신합니다. 하위 뷰는 정적 인 변환이 화면의 다른 곳으로 그려지기 때문에 그 위치를 실제로 알지 못합니다. 이 경우 사용자 정의 레이아웃의 유예하에 이벤트를 서브 뷰에 올바르게 전달할 수 있습니다.

+0

두 번째 솔루션이 더 좋은 것으로 보입니다. 나는이 길로 가려고 노력할 것이다. – hsz