ViewDragHelper_v4的滑动视图帮助类_解释和代码
16lz
2021-01-26
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);//拖动结束后调用..一般在这里写处理逻辑
事例:
//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>
更多相关文章
- Android(安卓)带有可滑动效果的用户引导页slidingtutorial-andro
- Android导航栏滑动折叠效果
- Android自定义viewpager且高度自适应
- android效果图之轮播
- RecycleView基本使用
- Android(安卓)ListView滑动回弹——overScrollBy
- Android触碰事件
- Android(安卓)滑动改变头部透明度
- Android(安卓)页面滑动切换