private ViewDragHelper mDragger;
mDragger = ViewDragHelper.create(this, 1.0f, callBack);
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
final int action = MotionEventCompat.getActionMasked(event);
if (action == MotionEvent.ACTION_CANCEL
|| action == MotionEvent.ACTION_UP) {
return false;
}
return mDragger.shouldInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mDragger.processTouchEvent(event);
return true;
}
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
Log.d("DragLayout", "clampViewPositionHorizontal " + left + ","
+ dx);
final int leftBound = getPaddingLeft();
final int rightBound = getWidth() - mView1.getWidth();
final int newLeft = Math.min(Math.max(left, leftBound), rightBound);
return newLeft;
}
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
final int topBound = getPaddingTop();
final int BottomBound = getHeight() - mView1.getHeight();
final int newTop = Math.min(Math.max(top, topBound), BottomBound);
return newTop;
}
private View mView1;
private View mView2;
private View mView3;
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mView1= getChildAt(0);
mView2= getChildAt(1);
mView3= getChildAt(2);
}
@Override
public boolean tryCaptureView(View child, int pointerId) {
// mView3禁止直接移動
return child == mView1|| child == mView2;
}
//用來存放要拖動view的起始位置
private Point mAutoBackOriginPos = new Point();
//獲取起始座標
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
mAutoBackOriginPos.x = mView2.getLeft();
mAutoBackOriginPos.y = mView2.getTop();
}
//一定要覆寫
@Override
public void computeScroll() {
if (mDragger.continueSettling(true)) {
invalidate();
}
}
// 手指釋放的時候回調
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
// mView2手指釋放時可以自動回去
if (releasedChild == mView2) {
mDragger.settleCapturedViewAt(mAutoBackOriginPos.x,
mAutoBackOriginPos.y);
//一定要invalidate
invalidate();
}
}
mDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
// 在邊界拖動時回調
@Override
public void onEdgeDragStarted(int edgeFlags, int pointerId) {
mDragger.captureChildView(mView3, pointerId);
}