ViewDragHelper行为测试

来源:互联网 发布:国产电视剧推荐 知乎 编辑:程序博客网 时间:2024/04/26 04:50
只是简单记录一下
以后可能会实现一些效果

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方法中)@Overridepublic int getOrderedChildIndex(int index) {// TODO Auto-generated method stubreturn super.getOrderedChildIndex(index);}//true的时候会锁住当前的边界,false则unLock。@Overridepublic boolean onEdgeLock(int edgeFlags) {// TODO Auto-generated method stubreturn super.onEdgeLock(edgeFlags);}//当触摸到边界时回调。@Overridepublic void onEdgeTouched(int edgeFlags, int pointerId) {// TODO Auto-generated method stubsuper.onEdgeTouched(edgeFlags, pointerId);}//当captureview被捕获时回调@Overridepublic void onViewCaptured(View capturedChild, int activePointerId) {// TODO Auto-generated method stubsuper.onViewCaptured(capturedChild, activePointerId);}//当ViewDragHelper状态发生变化时回调(IDLE,DRAGGING,SETTING[自动滚动时])@Overridepublic void onViewDragStateChanged(int state) {// TODO Auto-generated method stubsuper.onViewDragStateChanged(state);}//当captureview的位置发生改变时回调@Overridepublic void onViewPositionChanged(View changedView, int left,int top, int dx, int dy) {// TODO Auto-generated method stubsuper.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
0 0