参考:Android 之 ViewDragHelper 详解

     Android 之 ViewDragHelper详解(二)

看了几篇博客,并参考了上面的两篇博客,整理一下ViewDragHelper相关的知识点,便于以后查看。

一、自定义对象中需要做的操作

1、使用ViewDragHelper.create静态方法创建ViewDragHelper对象。

2、重写自定义控件中的onInterceptTouchEvent(调用ViewDragHelper对象的shouldInterceptTouchEvent)和onTouchEvent(调用processTouchEvent)方法。

二、Callback中的方法说明

1、clampViewPositionHorizontal和clampViewPositionVertical方法,不能返回0,否则将不能滑动

2、tryCaptureView方法,用于判断自定义控件的子控件中,那些可以滑动,那些不允许滑动

3、getOrderedChildIndex方法,默认返回的index就是传入的index。可以用这个方法实现子控件的重新排序。如果几个子控件在相互覆盖,可以使用这个方法确认几个控件的层次。

4、getViewHorizontalDragRange和getViewVerticalDragRange方法,默认返回0,如果子控件是Button等可以Click的控件,则无法拖拽。只有返回非0,Button这样的控件才能拖拽。

三、Callback中的回调方法

1、onViewPositionChanged,View位置变化了。可以在这个回调方法中,修改View的大小,实现QQ的效果。

2、onViewReleased,手指抬起的时候,会释放View。

3、onEdgeTouched,触摸到边缘的时候

4、onEdgeDragStarted,当触摸了边缘,并且正在MOVE的时候。

5、onViewCaptured,captureChildView调用的时候,这个方法会回调。

6、onViewDragStateChanged,拖拽状态(STATE_IDLE,STATE_DRAGGING,STATE_SETTLING[自动滚动],分别对应0,1,2)发生改变时回调。

7、onEdgeLock,默认不需要修改。处理比较极端的问题时候才会用到。比如:如果我从左到右滑动,却出现了,y方向滑动的距离的一半比x方向滑动的距离还要大

四、ViewDragHelper中比较常用的方法

1、shouldInterceptTouchEvent,在自定义控件中的onInterceptTouchEvent中调用

2、processTouchEvent,在自定义空间中的onTouchEvent中调用

3、continueSettling,当ViewDragHelper的状态是STATE_SETTLING(自动滚动)时,该方法会将子控件自动进行移动(使用Scroller实现测量空前当前应该处于的位置,然后调用View.offsetLeftAndRight和View.offsetTopAndBottom方法进行移动)。在自定义控件中的computeScroll方法中调用。computeScroll方法用于处理自动移动的状况,通常是在MONTIONEVENT.ACTION_UP的时候,调用Scroller.startScroll方法。

4、smoothSlideViewTo,将子控件平滑移动到指定位置。它调用了forceSettleCapturedViewAt,在forceSettleCapturedViewAt中会调用Scroller.startScroll方法。

5、settleCapturedViewAt,将子控件移动到指定位置。与smoothSlideViewTo相似,它也调用了forceSettleCapturedViewAt方法。与smoothSlideViewTo不同的是,它以手指离开时的速度为初速度,将子控件移动到指定位置。

6、captureChildView方法,将指定的子控件移动到指定位置。与上面两个方法不同的是,它直接移动到指定位置,不会有时间上的等待,也就是说不会有那种平滑的感觉。

7、flingCapturedView方法,与settleCapturedViewAt类似,都使用了手指离开时的速度作为计算的当前位置的依据。

8、cancel方法,取消此次移动,后续操作不进行。

9、abort方法,会调用cancel,但是调用了Scroller的abort方法,直接将子控件移动到指定位置,去除中间过程。

另外需要说明一点:

  原本以为continueSettling方法也是使用scrollTo来实现View的滑动效果(SlidingMenu使用的是scrollTo方法)。但是看源代码发现,continueSettling方法调用的是View.offsetLeftAndRight和offsetTopAndBottom方法来实现滑动效果。ViewDragHelper中另一个方法dragTo,同样使用的是offsetLeftAndRight实现滑动,而dragTo只在processTouchEvent的ACTION_MOVE中调用。

  通过阅读代码可以发现,scrollTo和scrollBy方法修改的是View类的mScrollX和mScrollY成员变量(源码中的注释表明这两个成员变量用于记录view中内容移动的距离);而offsetTopAndBottom和offsetLeftAndRight修改的是mTop、mBottom和mLeft、mRight成员变量(这四个变量表示view距离它的父控件的top和left的距离)。通过代码可以验证注释中的内容。

ViewDragHelper的更多相关文章

  1. Android -- ViewDragHelper

    ViewDragHelper SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDragHelper来处理拖动. ...

  2. Viewdraghelper解析

    2013年谷歌i/o大会上介绍了两个新的layout: SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用, 其实研究他们的源码你会发现这两个类都运用了ViewDr ...

  3. Android之ViewDragHelper

    在自定义ViewGroup中,很多效果都包含用户手指去拖动其内部的某个View(eg:侧滑菜单等),针对具体的需要去写好onInterceptTouchEvent和onTouchEvent这两个方法是 ...

  4. Android 一步一步教你使用ViewDragHelper

    在自定义viewgroup的时候 要重写onInterceptTouchEvent和onTouchEvent 这2个方法 是非常麻烦的事情,好在谷歌后来 推出了ViewDragHelper这个类.可以 ...

  5. Android ViewDragHelper源码解析

    在自定义ViewGroup的过程中,如果涉及到View的拖动滑动,ViewDragHelper的使用应该是少不了的,它提供了一系列用于用户拖动子View的辅助方法和相关的状态记录,像Navigatio ...

  6. Android 中 View移动总结:ViewDragHelper学习及用法详解

    如上图简单呈现出两个方块后,提出一个需求: 1.拖动方块时,方块(即子View)可以跟随手指移动. 2.一个方块移动时,另一个方块可以跟随移动. 3.将方块移动到左边区域(右边区域)后放开(即手指离开 ...

  7. ViewDragHelper详解

    2013年谷歌i/o大会上介绍了两个新的layout: SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDra ...

  8. ViewDragHelper的使用

    一.ViewDragHelper的原理 是一个能够自用移动ViewGroup内部View的控件. 通过获取ViewGroup的点击事件,之后通过Scroller滑动来进行对ViewGroup内部控件的 ...

  9. ViewDragHelper练习使用

    转载博客地址:http://www.cnblogs.com/flyme2012/p/4076674.html 这个Demo是用来练习VIewDragHelper的,也是仿照网上一个大神的代码.我通过他 ...

  10. Android ViewDragHelper完全解析 自定义ViewGroup神器

    Android ViewDragHelper完全解析 自定义ViewGroup神器   转载请标明出处: http://blog.csdn.net/lmj623565791/article/detai ...

随机推荐

  1. DBN 大作业

  2. VsCode之使用WebView通信

    之前我在这篇文章VsCode插件开发之插件初步通信 通过插件完成通信,这回我还是通过插件,只不过方式主要以在ts文件里面使用webview来进行通信. 另外在此声明,一定要好好看仔细看官方文档,国内关 ...

  3. storm集成kafka的应用,从kafka读取,写入kafka

    storm集成kafka的应用,从kafka读取,写入kafka by 小闪电 0前言 storm的主要作用是进行流式的实时计算,对于一直产生的数据流处理是非常迅速的,然而大部分数据并不是均匀的数据流 ...

  4. Android 由 android:launchMode="singleInstance“引发的界面无法返回的情况

    问题描述:现有A.B.C三个Activity.现在A跳转到B再由B跳转到C,然后依次返回.正常情况是C先返回B然后再返回的A.但现在的情况是C直接跳过B直接返回到A了. 解决办法:认真排查了A.B.C ...

  5. GIT 管理修改、删除文件

    管理修改 现在,假定你已经完全掌握了暂存区的概念.下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件. 你会问,什么是修改?比如你新增了一行,这就 ...

  6. chrome浏览器添加vue-devtools扩展

    1,在百度网盘中下载压缩包,网盘地址:https://pan.baidu.com/s/1i6UdvCD,密码:nvfe 2,将压缩包解压到F盘,F:\chromeVue插件 3,复制文件地址,F:\c ...

  7. 零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

    在这里还是要推荐下我自己建的Python开发学习群:483546416,群里都是学Python开发的,如果你正在学习Python ,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python ...

  8. 你想要的Python面试都在这里了【315+道题】

    写在前面 近日恰逢学生临近毕业,课程后期大家"期待+苦逼"的时刻莫过于每天早上内容回顾和面试题问答部分[临近毕业每天课前用40-60分钟对之前内容回顾.提问和补充,专挑班里不爱说话 ...

  9. 【转】js 获取浏览器高度和宽度值(多浏览器

    原文地址:http://www.jb51.net/article/19844.htm js获取浏览器高度和宽度值,尽量的考虑了多浏览器. IE中: document.body.clientWidth ...

  10. c# 获取文件本身的哈希值

    1. 哈希值是什么 我个人认为,哈希值是一个统称,也就是经过加密算法后得出的长度较短.位数固定的输出序列即散列值,这个哈希值是一个凭证,一个数字签名之类的,唯一对应你加密之前的东西,这都是我自个儿觉得 ...