博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ViewDragHelper_v4的滑动视图帮助类_解释和代码
阅读量:4290 次
发布时间:2019-05-27

本文共 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/

你可能感兴趣的文章
常用排序方法介绍
查看>>
Java异常分类和统一处理
查看>>
原 荐 cache线程池对数据库操作的饥饿问题
查看>>
使用Eclipse把java文件打包成jar 含有第三方jar库的jar包
查看>>
3种web会话管理的方式
查看>>
SSM(框架)-异常1:面向接口式编程异常
查看>>
Android蓝牙4.0之玩爆智能穿戴、家具(二)
查看>>
使用Condition实现多线程之间调用
查看>>
javaAPI之String
查看>>
JQ 新窗口打开链接并设置参数
查看>>
JS中常遇到的浏览器兼容问题和解决方法
查看>>
JAVA学习笔记之-servlet知识点
查看>>
apache 配置不同的端口访问不同的站点
查看>>
2017年3月Java9带来的革新!
查看>>
Log4j容器深入探究
查看>>
记glide框架使用中所遇到的问题
查看>>
学习AOP之透过Spring的Ioc理解Advisor
查看>>
Jquery一个简单的注册验证
查看>>
SpringMVC基础_ControllerAdvice
查看>>
Toast还能显示图片你知道么?
查看>>