Activity
에 GestureDetector
을 구현했습니다. 지금 내가처럼 전체 화면에서 모든 이벤트를 잡을 수 onSingleTapConfirmed
, onDoubleTap
, onLongPress
...GestureDetector와 접촉 한보기 얻기
그것이 누른 내 사용자 지정 레이아웃에서 어떤 View
감지 할 수 있습니까?
Activity
에 GestureDetector
을 구현했습니다. 지금 내가처럼 전체 화면에서 모든 이벤트를 잡을 수 onSingleTapConfirmed
, onDoubleTap
, onLongPress
...GestureDetector와 접촉 한보기 얻기
그것이 누른 내 사용자 지정 레이아웃에서 어떤 View
감지 할 수 있습니까?
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 뷰 회전식 캐 러셀을 구현할 때 이러한 변환을 사용했습니다. 이 경우, 당신이하고 싶은 것이 불가능하다는 것을 확신합니다. 하위 뷰는 정적 인 변환이 화면의 다른 곳으로 그려지기 때문에 그 위치를 실제로 알지 못합니다. 이 경우 사용자 정의 레이아웃의 유예하에 이벤트를 서브 뷰에 올바르게 전달할 수 있습니다.
두 번째 솔루션이 더 좋은 것으로 보입니다. 나는이 길로 가려고 노력할 것이다. – hsz