ViewDragHelper :
//is a utility class for writing custom ViewGroups. to drag and reposition views within their parent ViewGroup.


// android.support.v4.widget.ViewDragHelper


ViewDragHelper mVD = ViewDragHelper.create(ViewGroup forParent,ViewDragHelper.CallBack cb);
ViewDragHelper mVD = ViewDragHelper.create(ViewGroup forParent,float sensitivity,ViewDragHelper.Callback cb);


//作为一个帮助类.首先,需要进行 触摸和拦截的时间转交.
所有捕获的拖动.包括事件和监听,都需要建立在转交的基础上.


方法:
abort();
cancel();//相当于 precessTouchEvent(ev);接收到了 Cancel事件


boolean continueSettling(boolean deferCallbacks);


captureChildView(View childView,int activePointerId);//在 parent 中捕获一个详尽的 childView.
View getCapturedView();
settleCapturedViewAt(int finalLeft,int finalTop);//放下捕获的视图.


boolean checkTouchSlop(int derection,int pointerId);//检查滑动轨迹的方向 DIRECTION_HORIZONTAL, DIRECTION_VERTICAL, DIRECTION_ALL
boolean checkTouchSlop(int directions);
int getTouchSlop();
int getViewDragState();// STATE_IDLE, STATE_DRAGGING or STATE_SETTLING.


int getActivePointerId();


boolean continueSettling (boolean deferCallbacks);//滑动扑捉到的 View




boolean isEdgeTouched(int edges);// EDGE_LEFT, EDGE_TOP, EDGE_RIGHT, EDGE_BOTTOM and EDGE_ALL
boolean isEdgeTouched(int edges,int pointerId);
boolean isPointerDown(int pointerId);
boolean isViewUnder(View view,int x,int y);


int getEdgeSize();
float getMinVelocity();


setMinVelocity(float minVe);
//☆☆☆☆
void processTouchEvent(MotionEvent ev);//TouchEvent 事件转交
boolean shouldInterceptTouchEvent(MotionEvent me);
//Intercept转交 可以作为事件转交


//☆☆☆☆☆☆ 滑动...主动的动作.
smoothSlideSlideViewTo(View child,int finalleft,int finalTop);


protected
boolean canScroll(View v,boolean checkV,int dx,int dy,int x,int y);




ViewDragHelper.Callback :
捕获view 后的动作回调..作为执行判断的依据.
// a communication channel with the ViewDragHelper back to the parent view using it
//on*methods are invoked on siginficant events
// Callback 同时可以决定子view 的统治范围和可拖拽性.


int clampViewPositionHorizontal(View child, int left, int dx);//水平滑动.
//限定水平滑动的距离...left是坐标.dx为该变量
clampViewPositionVertical(View child, int top, int dy);//垂直滑动
getOrderedChildIndex(int index);
getViewHorizontalDragRange(View child);
getViewVerticalDragRange(View child);


boolean tryCaptureView(View child, int pointerId);// 何时开始监控.child当前捕获的view.


//事件回调
onEdgeDragStarted(int edgeFlags, int pointerId);
onEdgeLock(int edgeFlags);
onEdgeTouched(int edgeFlags, int pointerId);
onViewCaptured(View capturedChild, int activePointerId);//当用户触摸到 View 后.
onViewDragStateChanged(int state);//拖拽的状态改变时, idle dragging
onViewPositionChanged(View changedView, int left, int top, int dx, int dy);//位置改变时回调. 滑动改变 scale等用.
//子View移动之后的回调,在该方法中可以获取子VIew移动之后最新的left和top,该方法一般用来做
//伴随移动的
onViewReleased(View releasedChild, float xvel, float yvel);//拖动结束后调用..一般在这里写处理逻辑





事例:
<span style="font-family:Microsoft YaHei;font-size:12px;">   /**    *事件的拦截转交.交给 ViewDragHelper 处理.    *    */    public boolean onInterceptTouchEvent(MotionEvent ev){        return mVD.shouldInterceptTouchEvent(ev);    }    /**    *事件的转交.交给 ViewDragHelper 处理.    *    */    public boolean onTouchEvent(MotionEvent event){        mVD.processTouchEvent(event);        return true;//完全处理.即使在事件回传的时候    }    /**    *使用 ViewDragHelper 内部的 Scroller 进行滑动.但是同样需要 computeScroll 调用.    *       */    public void computeScroll(){        if(mVD.continueSettling(true)){             // ViewDragHelper 内部同样是用 Scroller.            ViewCompat.postInvalidateOnAnimation(this);        }    }    private ViewDragHelper.Callback callback = new ViewDragHelper.Callback(){        //必须重写的方法        public boolean tryCaptureView(View child,int pointerId){            return mMainView==child;        }        //返回捕获的控件,移动的距离..事件响应中,也是使用这些值.        public int clampViewPositionVertical(View child,int top,int dy){            return top;        }        public int clampViewPositionHorizontal(View child,int left,int dx){            return left;        }        //返回捕获控件可以拖动的距离        @Override        public int getViewHorizontalDragRange(View child) {            return int数字;   //有了范围.有了 clampViewPosition** .才会有移动        }        //常用.       注意.所有获得的值和控件.也是 tryCaptureView(),clampViewPosition*(),getView*DragRange()等决定的.        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy){        }        //常用.           事件回调..释放捕获时.        public void onViewReleased(View releasedChild,float xvel,float yvel){            super.onViewReleased(releasedChild,xvel,yvel);            if(mMainView.getLeft() < 500){                mVD.smoothSlideSlideViewTo(mMainView,0,0);                ViewCompat.postInvalidateOnAnimation(DragViewGoup.this);            }else{                mVD.smoothSlideSlideViewTo(mMainView,300,0);                ViewCompat.postInvalidateOnAnimation(DragViewGroup.this);            }        }    };</span>

更多相关文章

  1. Android(安卓)带有可滑动效果的用户引导页slidingtutorial-andro
  2. Android导航栏滑动折叠效果
  3. Android自定义viewpager且高度自适应
  4. android效果图之轮播
  5. RecycleView基本使用
  6. Android(安卓)ListView滑动回弹——overScrollBy
  7. Android触碰事件
  8. Android(安卓)滑动改变头部透明度
  9. Android(安卓)页面滑动切换

随机推荐

  1. Android内存优化总结&实践
  2. 做推送,怎么能不了解推送的 4 种消息形式
  3. 2017-2020历年字节跳动Android面试真题解
  4. 基于Android的温湿度采集系统
  5. Android(安卓)NDK之旅-OpenGL 初探
  6. WPS Office移动版(Android)限时免费,送小
  7. Android(安卓)将自己的Launcher设置为默
  8. Android(安卓)自定义数字键盘(一)
  9. 【构建Android缓存模块】(一)吐槽与原理分
  10. Android(安卓)nomedia 避免图片等资源泄