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的更多相关文章
- Android -- ViewDragHelper
ViewDragHelper SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDragHelper来处理拖动. ...
- Viewdraghelper解析
2013年谷歌i/o大会上介绍了两个新的layout: SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用, 其实研究他们的源码你会发现这两个类都运用了ViewDr ...
- Android之ViewDragHelper
在自定义ViewGroup中,很多效果都包含用户手指去拖动其内部的某个View(eg:侧滑菜单等),针对具体的需要去写好onInterceptTouchEvent和onTouchEvent这两个方法是 ...
- Android 一步一步教你使用ViewDragHelper
在自定义viewgroup的时候 要重写onInterceptTouchEvent和onTouchEvent 这2个方法 是非常麻烦的事情,好在谷歌后来 推出了ViewDragHelper这个类.可以 ...
- Android ViewDragHelper源码解析
在自定义ViewGroup的过程中,如果涉及到View的拖动滑动,ViewDragHelper的使用应该是少不了的,它提供了一系列用于用户拖动子View的辅助方法和相关的状态记录,像Navigatio ...
- Android 中 View移动总结:ViewDragHelper学习及用法详解
如上图简单呈现出两个方块后,提出一个需求: 1.拖动方块时,方块(即子View)可以跟随手指移动. 2.一个方块移动时,另一个方块可以跟随移动. 3.将方块移动到左边区域(右边区域)后放开(即手指离开 ...
- ViewDragHelper详解
2013年谷歌i/o大会上介绍了两个新的layout: SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDra ...
- ViewDragHelper的使用
一.ViewDragHelper的原理 是一个能够自用移动ViewGroup内部View的控件. 通过获取ViewGroup的点击事件,之后通过Scroller滑动来进行对ViewGroup内部控件的 ...
- ViewDragHelper练习使用
转载博客地址:http://www.cnblogs.com/flyme2012/p/4076674.html 这个Demo是用来练习VIewDragHelper的,也是仿照网上一个大神的代码.我通过他 ...
- Android ViewDragHelper完全解析 自定义ViewGroup神器
Android ViewDragHelper完全解析 自定义ViewGroup神器 转载请标明出处: http://blog.csdn.net/lmj623565791/article/detai ...
随机推荐
- Cookie,Session的区别
1.Cookie 存储在用户本地上即客户端的数据,用来辨别用户的身份. 如果勾选了记住我则会在C盘中保存Cookie的信息,直至Cookie设置的有效期过期 注意: (1)记录用户访问次数 (2)不可 ...
- ubuntu开机自动运行用Qt写的程序
这里介绍一种在ubuntu系统开机自动运行使用Qt编写的程序的方法.首先要注意要自动运行Qt编的程序,不需要先打开Qt,而是直接运行编译好的与工程名同名的可执行文件即可,比如我要运行的工程为QRDec ...
- Android Studio复制项目作为一个新的工程
Android Studio复制项目作为一个新的工程 等待..... 好了 可能会安装失败 Failed to finalize session : INSTALL_FAILED_INVALID_AP ...
- 浅析单点登录,以及不同二级域名下的SSO实现
一家公司有多个产品线,就可能要有多个子域名,下头以baidu域名为例,a.baidu.com, b.baidu.com.com 是顶级域名,baidu 就是一个二级域名,a和b就是子域名. 当用户在a ...
- Docker中运行Dockerfile时报错“cannot allocate memory”
今天运行Dockerfile脚本时报错了,现记录下来: Step / : RUN -bin/myagent symlink /proc/mounts /var/lib/docker/overlay/2 ...
- (转)PostgreSQL pg_dump&psql 数据的备份与恢复
转自:https://www.cnblogs.com/chjbbs/p/6480687.html Usage: pg_dump [OPTION]... [DBNAME] 数据库名放最后,不指定默认 ...
- Perhaps you are running on a JRE rather than a JDK
在Eclipse中跑maven项目时,出现上面的问题: 1.有可能你的环境变量配置是在jre上面的,所以你要检查一下你配置文件,PATH和CLASSPATH都要检查 2.eclipse默认是跑在jre ...
- 同一个解决方案或有依赖关系的两个项目引用同名但不同版本的DLL
问题描述 我们最近在使用Redis作Session的集中化,中间碰到了一个如下问题:我们有一些项目比较老,引用了NewtonJson的4.0.3.0版本的DLL,但是Redis提供的C#集成DLL引用 ...
- CF 799B T-shirt buying
一道超级水的练习STL的题目 题目大意:有\(n\)件T恤,每件T恤都分别有价格(每件衣服的价格不重复).前面的颜色.背部的颜色三种属性.接下来有\(m\)个人每个人都有一种喜欢的颜色,他们按先后顺序 ...
- 过渡与动画 - 缓动效果&基于贝塞尔曲线的调速函数
难题 给过渡和动画加上缓动效果是一种常见的手法(比如具有回弹效果的过渡过程)是一种流行的表现手法,可以让界面显得更加生动和真实:在现实世界中,物体A点到B点往往也是不完全匀速的 以纯技术的角度来看,回 ...