美文网首页自定义控件
Android:随笔——自定义View的好帮手 ViewDrag

Android:随笔——自定义View的好帮手 ViewDrag

作者: QuincySx | 来源:发表于2017-04-04 15:04 被阅读684次

    转载请标明地址 QuincySxhttp://www.jianshu.com/p/e19a8735b123

    ViewDragHelper是用于编写自定义ViewGroups的实用工具类。它提供了许多有用的操作和状态跟踪,允许用户拖动和重新定位其父ViewGroup中的视图。


    在自定义View里如何创建 ViewDragHelper
    第一步
    mDragHelper = ViewDragHelper.create(this, 1f, mCallback); 第一个参数传 ViewGroup 、第二个参数传 Float 代表灵敏度 默认为 1.0f 值越大灵敏度越高 、第三个参数为 ViewDragHelper.Callback

    第二步 重写 ViewGroup 的 onInterceptTouchEvent 方法
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
    return mDragHelper.shouldInterceptTouchEvent(ev);
    }

    第三步 重写 ViewGroup 的 onTouchEvent 方法,并且返回 true
    @Override
    public boolean onTouchEvent(MotionEvent event) {
    mDragHelper.processTouchEvent(event);
    return true;
    }

    下面再介绍一下 ViewDragHelper.Callback 下面简称 Callback

    这是 Callback 的方法 ( 直接点击方法名可以直接观看 Google 的官方文档 )

    只有此方法才是默认实现的方法 除此之外其他方法都需要自行按需实现
    abstract boolean [tryCaptureView](https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#tryCaptureView(android.view.View, int))(View child, int pointerId)
    此方法是判断子 View 是否能够响应事件,如果返回 true 则当前 View 能够响应事件,反之则不能

    int [clampViewPositionHorizontal](https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#clampViewPositionHorizontal(android.view.View, int, int))(View child, int left, int dx)
    限制子 View 只能沿着 X 轴 运动,也就是只能水平运动, 返回值是子 View 左边的距离

    int [clampViewPositionVertical](https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#clampViewPositionVertical(android.view.View, int, int))(View child, int top, int dy)
    限制子 View 只能沿着 Y 轴 运动,也就是只能竖直运动, 返回值是子 View 上边的距离

    int getOrderedChildIndex(int index)
    如果在同一个位置有两个子View重叠,想要让下层的子View被选中,那么就要实现这个方法来改变查找子View的顺序

    int getViewHorizontalDragRange(View child)
    返回可拖动子 View 的水平移动范围。对于不能水平移动的视图,此方法应返回0。

    int getViewVerticalDragRange(View child)
    返回可拖动子 View 的竖直移动范围。对于不能竖直移动的视图,此方法应返回0。

    void [onEdgeDragStarted](https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#onEdgeDragStarted(int, int))(int edgeFlags, int pointerId)
    当 onEdgeTouched 被调用时,则该方法被调用
    mDragHelper.captureChildView(mImageView, pointerId);

    boolean onEdgeLock(int edgeFlags)
    待完善

    void [onEdgeTouched](https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#onEdgeTouched(int, int))(int edgeFlags, int pointerId)
    当监听到 ViewGroup 的滑动事件没有被子 View 所消费掉时,触发此事件(就是当没有滑动在子 View 上的情况)

    void [onViewCaptured](https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#onViewCaptured(android.view.View, int))(View capturedChild, int activePointerId)
    当子 View 位置开始发生改变时 响应此方法,与 onViewReleased 相对应

    void onViewDragStateChanged(int state)
    拖动状态改变时 响应此接口
    STATE_IDLE
    STATE_DRAGGING
    STATE_SETTLING

    void [onViewPositionChanged](https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#onViewPositionChanged(android.view.View, int, int, int, int))(View changedView, int left, int top, int dx, int dy)
    当 View 位置改变时,调用此方法,这个方法与 onViewCaptured 不同,此方法只要位置发生变化就会响应,而 onViewCaptured 只会在子 View 位置发生变化的时候被调用一次

    void [onViewReleased](https://developer.android.google.cn/reference/android/support/v4/widget/ViewDragHelper.Callback.html#onViewReleased(android.view.View, float, float))(View releasedChild, float xvel, float yvel)
    当 View 释放的时候回调,与 onViewCaptured相对应

    总结

    这里我只是解释了一下怎么使用,每个接口的意思,具体使用可能需要大家理解一下了,我以后写自定义 View 会敲个 Demo 给大家分享一下的
    未完待续。。。

    Todo:具体Demo

    相关文章

      网友评论

        本文标题:Android:随笔——自定义View的好帮手 ViewDrag

        本文链接:https://www.haomeiwen.com/subject/otzaottx.html