수색…


하위보기 및 상위보기 그룹 터치 이벤트의 차이점을 표시하는 방법

  1. 중첩 된 뷰 그룹에 대한 onTouchEvents()boolean onInterceptTouchEvent에 의해 관리 될 수 있습니다.

OnInterceptTouchEvent 의 기본값은 false입니다.

부모의 onTouchEvent 는 자식의 전에 수신됩니다. OnInterceptTouchEvent 가 false를 반환하면 모션 이벤트를 체인 아래로 자식의 OnTouchEvent 핸들러로 보냅니다. true를 돌려주는 경우, 부모는 touch 이벤트를 처리합니다.

그러나 일부 자식 요소에서 OnTouchEvent 를 관리하고 일부는 부모 뷰 (또는 부모의 부모)가 관리 OnTouchEvent 경우가있을 수 있습니다.

이것은 여러 가지 방법으로 관리 될 수 있습니다.

  1. 부모 요소의 OnInterceptTouchEvent 로부터 자식 요소를 보호 할 수있는 한 가지 방법은 OnInterceptTouchEvent 를 구현하는 입니다.

public void requestDisallowInterceptTouchEvent (boolean disallowIntercept)

이렇게하면 요소에서 이벤트 처리기를 사용할 수있는 경우 상위 뷰에서이 요소에 대한 OnTouchEvent 를 관리 할 수 ​​없습니다.

OnInterceptTouchEvent 가 false이면 자식 요소의 OnTouchEvent 가 평가됩니다. 다양한 터치 이벤트를 처리하는 하위 요소 내에 메소드가있는 경우, 사용 불가능한 관련 이벤트 핸들러는 OnTouchEvent를 상위로 리턴합니다.

이 답변 :
터치 이벤트 전파가 어떻게 지나가는 지 시각화 :
parent -> child|parent -> child|parent -> child views.

여기에 이미지 설명을 입력하십시오. 여기에서 의례

  1. 또 다른 방법은 부모에 대한 OnInterceptTouchEvent 에서 다양한 값을 반환하는 것입니다.

이 예제 는 ViewGroup에서 터치 이벤트 관리 에서 가져온 것으로, 사용자가 스크롤 할 때 자녀의 OnTouchEvent 를 가로채는 방법을 보여줍니다.

4a.

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    /*
     * This method JUST determines whether we want to intercept the motion.
     * If we return true, onTouchEvent will be called and we do the actual
     * scrolling there.
     */


    final int action = MotionEventCompat.getActionMasked(ev);

    // Always handle the case of the touch gesture being complete.
    if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
        // Release the scroll.
        mIsScrolling = false;
        return false; // Do not intercept touch event, let the child handle it
    }

    switch (action) {
        case MotionEvent.ACTION_MOVE: {
            if (mIsScrolling) {
                // We're currently scrolling, so yes, intercept the 
                // touch event!
                return true;
            }

            // If the user has dragged her finger horizontally more than 
            // the touch slop, start the scroll

            // left as an exercise for the reader
            final int xDiff = calculateDistanceX(ev); 

            // Touch slop should be calculated using ViewConfiguration 
            // constants.
            if (xDiff > mTouchSlop) { 
                // Start scrolling!
                mIsScrolling = true;
                return true;
            }
            break;
        }
        ...
    }

    // In general, we don't want to intercept touch events. They should be 
    // handled by the child view.
    return false;
}

다음은 요소 주위에 사각형의 매개 변수를 만드는 방법을 보여주는 동일한 링크의 일부 코드입니다.

4b.

// The hit rectangle for the ImageButton
myButton.getHitRect(delegateArea);
        
// Extend the touch area of the ImageButton beyond its bounds
// on the right and bottom.
delegateArea.right += 100;
delegateArea.bottom += 100;
        
// Instantiate a TouchDelegate.
// "delegateArea" is the bounds in local coordinates of 
// the containing view to be mapped to the delegate view.
// "myButton" is the child view that should receive motion
// events.
TouchDelegate touchDelegate = new TouchDelegate(delegateArea, myButton);
 
// Sets the TouchDelegate on the parent view, such that touches 
// within the touch delegate bounds are routed to the child.
if (View.class.isInstance(myButton.getParent())) {
    ((View) myButton.getParent()).setTouchDelegate(touchDelegate);
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow