머리말
기사에 같은 효과가 하나의 최종 효과를 달성하는 데 사용되는 잠금 화면 벽지 함수 내에서 음악을 사용하기 전에 동일한 기능, 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 재현