독서 노트 - View의 미끄럼 충돌

3814 단어 슬라이딩 충돌

View 슬라이딩 충돌


흔히 볼 수 있는 미끄럼 충돌은 흔히 볼 수 있다

  • 1.외부 슬라이딩 방향과 내부 슬라이딩 방향이 일치하지 않습니다.
  • 2.외부 슬라이딩 방향과 내부 슬라이딩 방향이 일치합니다.
  • 3.위 두 가지 시나리오의 네스트
  • 슬라이딩 충돌 해결 방법

  • 1.외부 차단법
  • 외부 차단법이란 클릭 이벤트가 모두 부모 용기의 차단 처리를 거쳐 부모 용기가 필요하면 차단하고 필요하지 않으면 차단하지 않는 것을 말한다.외부 차단법은 부모 용기의 onInterceptTouchEvent 방법을 다시 써야 하며 내부에서 응답하는 차단을 하면 된다.위조 코드는 다음과 같습니다.
    public boolean onInterceptTouchEvent(MotionEvent ev){
        boolean intercepted=false;
        int x=(int)ev.getX();
        int y=(int)ev.getY();
    
        switch(ev.getAction){
            case MotionEvent.ACTION_DOWN:
                intercepted=false;
            break;
            case MotionEvent.ACTION_MOVE:
                if(           ){
                    intercepted=true;
                }else{
                    intercepted=false;
                }
            break;
            case MotionEvent.ACTION_UP:
                intercepted=false;
            break;
            default:
            break;
        }
    
        mLastXIntercept=x;
        mLastYIntercept=y;
        return intercepted;
    }
  • 내부 차단법
  • 내부 차단법은 부모 용기가 어떤 사건도 차단하지 않고 모든 사건이 하위 원소에 전달되는 것을 말한다. 만약에 하위 원소가 이 사건을 필요로 하면 바로 소모하고 그렇지 않으면 부모 용기에 맡겨 처리한다. 이런 방법은 안드로이드의 사건 분배 메커니즘과 일치하지 않기 때문에 RequestDisallowInterceptTouchEvent 방법과 협조해야 정상적으로 작동할 수 있고 외부 차단법보다 약간 복잡하다.
    public boolean dispatchTouchEvent(MotionEvent ev){
        int x=(int)ev.getX();
        int y=(int)ev.getY();
    
        switch(ev.getAction){
            case MotionEvent.ACTION_DOWN:
                parent.requestDisallowInterceptTouchEvent(true);
            break;
            case MotionEvent.ACTION_MOVE:
                int deltaX=x-mLastX;
                int deltaY=y-mLastY;
    
                if(           ){
                    parent.requestDisallowInterceptTouchEvent(false);
                }
            break;
            case MotionEvent.ACTION_UP:
            break;
            default:
            break;
        }
    
        mLastX=x;
        mLastY=y;
        return super.dispatchTouchEvent(ev);
    }

    이 방법에서 왜 모 컨테이너가 ACTION을 차단할 수 없습니까DOWN 이벤트?ACTION 때문에...DOWN 이벤트는 FLAG 을 받지 않습니다.DISALLOW_INTERCEPT라는 표지 위치를 제어하기 때문에 부모 용기가 ACTION을 차단하면DOWN 이벤트는 모든 이벤트가 하위 요소로 전달되지 않기 때문에 내부 차단이 작동하지 않습니다.

    좋은 웹페이지 즐겨찾기