`

ViewDragHelper行为测试

阅读更多
只是简单记录一下
以后可能会实现一些效果

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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics