序文
1上記Benpianは、最終的な効果を達成するために使用されるロック画面の壁紙関数内の音楽を使用すると、記事に同じ効果である前に、同じ機能、ViewDragHelper Cipianを達成するため、これだけ説明する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()メソッドは、決意の条件だけでなく、移動イベントに別段停止しています、ViewDragHelperは受け取りませアップイベントは、mViewDragHelper.shouldInterceptTouchEvent(EV)を知るためにソースコードを表示し、mViewDragHelper.processTouchEvent(イベント)メソッドは、同時に3つのイベントでなければなりません。
スライド処理
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():ユーザは、我々は、直接戻る偽全体のViewGroupを移動するためのサブ表示は、動作を捕獲かを決定します。
2、onViewReleasedは():ドラッグ完了コールバックビューは、内部の最終位置、表示するとき(0、0)メイン処理LET後にモバイルを呼び出すことによって達成される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);
}
説明:コールバック関数の戻り値をドラッグしながらmViewDragHelper.continueSettling(true)メソッドは常にプロセスよりスムーズドラッグを行い、主にスクローラのスライド機構を用いて、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();
}
}
概要
スコープを扱うタイミングとタッチイベントの、だけでなく、他の態様とViewDragHelper契約各コールバックメソッドの問題で差なしで、テストが完了しているパートBenpianは、主な違いを修正するためのさまざまな方法を使用して、効果がパートIと完全に一致します。それは、更に別のパッケージである、フォローアップは、最新のコードを更新していきます。
右側のスライド端アクティビティ
ます。https://www.jianshu.com/p/533d199db90eで再現