以后可能会实现一些效果
import android.content.Context; import android.graphics.Point; import android.support.v4.widget.ViewDragHelper; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; /** * http://blog.csdn.net/lmj623565791/article/details/46858663 * http://flavienlaurent.com/blog/2013/08/28/each-navigation-drawer-hides-a-viewdraghelper/ * http://blog.denevell.org/android-viewdraghelper-example-tutorial.html */ public class VDHLayout extends LinearLayout { private View mDragView,mAutoBackView,mEdgeTrackerView; private ViewDragHelper mDragHelper; private Point mAutoBackOriginPos = new Point(); public VDHLayout(Context context, AttributeSet attrs) { super(context, attrs); mDragHelper = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() { //返回ture则表示可以捕获该view;可以根据传入的view参数决定哪些可以拖动 @Override public boolean tryCaptureView(View child, int pointerId) { //mEdgeTrackerView禁止直接移动 // return child == mDragView || child == mAutoBackView; return true; } //控制水平拖动的边界 @Override public int clampViewPositionHorizontal(View child, int left, int dx) { final int leftBound = getPaddingLeft(); final int rightBound = getWidth() - child.getWidth() - leftBound; final int newLeft = Math.min(Math.max(left, leftBound), rightBound); return newLeft; // return left; } //控制垂直拖动的边界 @Override public int clampViewPositionVertical(View child, int top, int dy) { final int topBound = getPaddingTop(); final int bottomBound = getHeight() - child.getHeight() - topBound; final int newTop = Math.min(Math.max(top, topBound), bottomBound); return newTop; // return top; } //手指释放的时候回调 @Override public void onViewReleased(View releasedChild, float xvel, float yvel) { super.onViewReleased(releasedChild, xvel, yvel); // if(yvel>0) { // mDragHelper.settleCapturedViewAt(releasedChild.getLeft(), getMeasuredHeight()-releasedChild.getMeasuredHeight()); // } else { // mDragHelper.settleCapturedViewAt(releasedChild.getLeft(), 0); // } // invalidate(); // //mAutoBackView手指释放时可以自动原路返回 // if (releasedChild == mAutoBackView) // { // //调用settleCapturedViewAt回到初始的位置 // mDragHelper.settleCapturedViewAt(mAutoBackOriginPos.x, mAutoBackOriginPos.y); // //需要invalidate()以及结合computeScroll方法一起 // invalidate(); // } } //在边界拖动时回调 @Override public void onEdgeDragStarted(int edgeFlags, int pointerId) { //在onEdgeDragStarted回调方法中,主动通过captureChildView对其进行捕获,该方法可以绕过tryCaptureView,所以我们的tryCaptureView虽然并为返回true,但却不影响 //注意如果需要使用边界检测需要添加上mDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);。 mDragHelper.captureChildView(mEdgeTrackerView, pointerId); } //让clickable=true的子控件也可以拖动 @Override public int getViewHorizontalDragRange(View child) { return getMeasuredWidth()-child.getMeasuredWidth(); } //让clickable=true的子控件也可以拖动 @Override public int getViewVerticalDragRange(View child) { return getMeasuredHeight()-child.getMeasuredHeight(); } //改变同一个坐标(x,y)去寻找captureView位置的方法。(具体在:findTopChildUnder方法中) @Override public int getOrderedChildIndex(int index) { // TODO Auto-generated method stub return super.getOrderedChildIndex(index); } //true的时候会锁住当前的边界,false则unLock。 @Override public boolean onEdgeLock(int edgeFlags) { // TODO Auto-generated method stub return super.onEdgeLock(edgeFlags); } //当触摸到边界时回调。 @Override public void onEdgeTouched(int edgeFlags, int pointerId) { // TODO Auto-generated method stub super.onEdgeTouched(edgeFlags, pointerId); } //当captureview被捕获时回调 @Override public void onViewCaptured(View capturedChild, int activePointerId) { // TODO Auto-generated method stub super.onViewCaptured(capturedChild, activePointerId); } //当ViewDragHelper状态发生变化时回调(IDLE,DRAGGING,SETTING[自动滚动时]) @Override public void onViewDragStateChanged(int state) { // TODO Auto-generated method stub super.onViewDragStateChanged(state); } //当captureview的位置发生改变时回调 @Override public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { // TODO Auto-generated method stub super.onViewPositionChanged(changedView, left, top, dx, dy); } }); //如果需要使用边界检测需要添加上 mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); // mDragHelper = ViewDragHelper.create(this, 1.0f, new OurViewDragHelperCallbacks()); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { // final int action = MotionEventCompat.getActionMasked(event); // if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { // mDragHelper.cancel(); // return false; // } return mDragHelper.shouldInterceptTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { mDragHelper.processTouchEvent(event); return true; } @Override public void computeScroll() { super.computeScroll(); if(mDragHelper.continueSettling(true)) { invalidate(); // ViewCompat.postInvalidateOnAnimation(this); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); mAutoBackOriginPos.x = mAutoBackView.getLeft(); mAutoBackOriginPos.y = mAutoBackView.getTop(); } @Override protected void onFinishInflate() { super.onFinishInflate(); // mHeaderView = findViewById(R.id.viewHeader); // mDescView = findViewById(R.id.viewDesc); mDragView = getChildAt(0); mAutoBackView = getChildAt(1); mEdgeTrackerView = getChildAt(2); } }
<com.mb.door.VDHLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center" android:layout_margin="10dp" android:background="#FFff0000" android:gravity="center" android:text="I can be dragged !" /> <TextView android:layout_width="50dp" android:layout_height="100dp" android:layout_gravity="center" android:layout_margin="10dp" android:background="#FF00FF00" android:gravity="center" android:text="I can be dragged !" /> <TextView android:layout_width="100dp" android:layout_height="50dp" android:layout_gravity="center" android:layout_margin="10dp" android:background="#FF0000FF" android:gravity="center" android:text="I can be dragged !" /> </com.mb.door.VDHLayout>
ItemTouchHelper之SwipeDismiss
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0822/3349.html
https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-b9456d2b1aaf
ViewDragHelper.CallBack中每个方法的用法
http://m.blog.csdn.net/blog/coder_nice/44678153