이벤트 분배 인스턴스 활동의 안드로이드 슬라이드 오른쪽 끝 (B)

머리말

기사에 같은 효과가 하나의 최종 효과를 달성하는 데 사용되는 잠금 화면 벽지 함수 내에서 음악을 사용하기 전에 동일한 기능, ViewDragHelper Cipian를 달성하기 위 Benpian는, 그래서 그냥 Benpian에게 설명하는 새로운 내용을 선택합니다.

특정 단계

이벤트 유통 및 분쟁 해결

@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean canScrollHorizontally = canScrollHorizontally(-1, this);
        if (!canScrollHorizontally) {
            return mViewDragHelper.shouldInterceptTouchEvent(ev);
        }
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mViewDragHelper.processTouchEvent(event);
        return true;
    }

설명 :이 게시물은 메인 이벤트가 ViewDragHelper 처리이라고 불리는 때문에 이미 명확하게 세 개의 작은 이벤트를 포함하는 이벤트를 말에, 처리 canScrollHorizontally () 메소드는, 결정 조건뿐만 아니라, 이동 이벤트에 그렇지 않으면 아래 있습니다 , 업 이벤트는, 수신의 동시 행사해야 mViewDragHelper.shouldInterceptTouchEvent (EV) 및 mViewDragHelper.processTouchEvent (이벤트) 방법을 알고 소스 코드를 볼 수 없습니다 ViewDragHelper.

슬라이드 처리

ViewDragHelper 효과 슬라이딩 달성함으로써 ViewDragHelper 콜백 ViewDragHelper.Callback 효과를 구현하여 슬라이딩 달성하는 것이다.

        @Override
        public boolean tryCaptureView(View child, int pointerId) {
            return false;
        }

        @Override
        public void onViewReleased(View releasedChild, float xvel, float yvel) {
            //当前回调,松开手时触发,比较触发条件和当前的滑动距离
            int left = releasedChild.getLeft();
            if (left <= mMaxSlideWidth) {
                //缓慢滑动的方法,小于触发条件,滚回去
                mViewDragHelper.settleCapturedViewAt(0, 0);
            } else {
                //大于触发条件,滚出去...
                mViewDragHelper.settleCapturedViewAt(mScreenWidth, 0);
            }

            //需要手动调用更新界面的方法
            invalidate();
        }

        @Override
        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
            mScrollPercent = Math.abs((float) left
                    / (mScreenWidth + mEdgeShadow.getIntrinsicWidth()));
            //重绘
            invalidate();

            //当滚动位置到达屏幕最右边,则关掉Activity
            if (changedView == mRootView && left >= mScreenWidth) {
                mActivity.finish();
            }
        }

        @Override
        public int getViewHorizontalDragRange(View child) {
            return ViewDragHelper.EDGE_LEFT;
        }

        @Override
        public int clampViewPositionHorizontal(View child, int left, int dx) {
            //限制左右拖拽的位移
            left = left >= 0 ? left : 0;
            return left;
        }

        @Override
        public int clampViewPositionVertical(View child, int top, int dy) {
            //上下不能移动,返回0
            return 0;
        }

        @Override
        public void onEdgeDragStarted(int edgeFlags, int pointerId) {
            //触发边缘时,主动捕捉mRootView
            mViewDragHelper.captureChildView(mRootView, pointerId);
        }

설명 : 1, tryCaptureView () : 사용자가 우리가 직접 false를 반환 전체 뷰 그룹을 이동하기 때문에 하위보기, 동작을 캡처 결정합니다.
2, onViewReleased는 () : 드래그 완료 콜백보기, 내부 최종 위치, 볼 때 (0, 0) 주 처리하자 후 모바일을 호출하여 얻을 수 mViewDragHelper.settleCapturedViewAt 방법은 스크롤러 이동
이름 방법 참조 알고 : 3, onViewPositionChanged ()가 위치의 변화가, 그것이 최종 단부 위치에 의해 결정될 수있다보기 콜백 우단 초과 활동
4 getViewHorizontalDragRange (). 수평 방향의 전류 범위를 얻기 좌측 가장자리에 설치된 우측 슬라이더
5 clampViewPositionHorizontal () : 제한 레벨 위치 및 방향, 기본이 제한되지 않고, 그것은 한계가 0보다 큰 재 기입 할 필요가 있고, 이것이 달성 될 수있는 오른쪽 슬라이드
6 clampViewPositionVertical () : 수직 방향의 한계 위치는 오른쪽 슬라이드 재 기입되지 않을 수
없는 서브 클래스 7 onEdgeDragStarted () 부모 클래스의 트레일 링 에지에서 캡처 설정하기 전에 콜백이 시간은 활동의보기를 캡처 할 때

@Override
    public void computeScroll() {
        //使用settleCapturedViewAt方法是,必须重写computeScroll方法,传入true
        //持续滚动期间,不断刷新ViewGroup
        if (mViewDragHelper.continueSettling(true))
            ViewCompat.postInvalidateOnAnimation(this);
    }

설명 : 콜백 반환 값은 항상 공정을 더 원활하게 끌어 드래그 (TRUE) 방법 mViewDragHelper.continueSettling는 mViewDragHelper.settleCapturedViewAt (0, 0), 주로 스크롤러의 슬라이딩 메커니즘을 사용하여 반향.

터치 범위

상기 단계는 오른쪽 슬라이드 이루어진 것으로 할 수 있지만, 내부 ViewDragHelper 검출 에지시킨 후 드래그 이동. 이 값을 수정해야합니다 전체 화면 드래그 효과를 달성하고자하는 경우 기본 소스, ViewDragHelper 에지 20dp이다, 반사를 얻을 수 있도록 소스 코드와 ViewDragHelper 가장자리 폭이 변경 될 수 있습니다 볼 수있는 방법이 없습니다.

/**
     * 设置可以拖拽的触点范围
     *
     * @param touchRange
     */
    private void setTouchRange(int touchRange) {
        Class<?> aClass = mViewDragHelper.getClass();
        Field mDividerHeight = null;
        try {
            mDividerHeight = aClass.getDeclaredField("mEdgeSize");
            mDividerHeight.setAccessible(true);
            mDividerHeight.setInt(mViewDragHelper, touchRange);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

개요

주요 차이점을 수정할 수있는 여러 가지 방법을 사용하여 파트 Benpian 타이밍 및 터치 이벤트뿐만 아니라 다른 측면 차이를 처리하지 ViewDragHelper 각 콜백 메소드의로, 테스트가 완료되고, 범위를 처리하는 문제이다, 효과는 부와 완전히 일치한다 . 그것은 후속 최신 코드를 업데이트하는 것, 또 다른 패키지입니다.
오른쪽 슬라이드 최종 활동

HTTPS : //www.jianshu.com/p/533d199db90e 재현

추천

출처blog.csdn.net/weixin_33696106/article/details/91079267