本文共 4695 字,大约阅读时间需要 15 分钟。
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);//拖动结束后调用..一般在这里写处理逻辑 事例: /** *事件的拦截转交.交给 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); } } };
转载地址:http://ddegi.baihongyu.com/