Android:随笔——自定义View的好帮手 ViewDragHelper-阿里云开发者社区

开发者社区> quincy> 正文

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

简介: 转载请标明地址 QuincySx: http://www.jianshu.com/p/e19a8735b123 ViewDragHelper是用于编写自定义ViewGroups的实用工具类。
+关注继续查看

转载请标明地址 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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
推荐一大波让你直呼哇塞的Canvas库【值得收藏】
推荐一大波让你直呼哇塞的Canvas库【值得收藏】
19 0
安卓平板体验Java开发,还能白嫖一年阿里无影云!真香
阿里无影云早有耳闻,前两天看朋友发体验照片,可能是程序员天生爱折腾的特性又发挥作用了,自己也没能忍住,赶快下载体验了一把,没想到“很香”。我体验了浏览器端、Windows 客户端和安卓平板端,下面就来聊聊使用的过程和使用体验。内含一年免费无影云的白嫖方法,千万别错过哦~
31 0
Spotify的牛是如何炼成的?
编著者按:笔者近期在思考工程文化相关的内容,除了自我总结以及对Google、Facebook的一些探索外,目光再次投向了Spotify这家公司。这是一个高速增长的故事,这是以一个工程文化知名的故事,同时这也是敏捷圈在讲的故事。
5 0
计算机基础3 | 学习笔记
快速学习计算机基础3。
8 0
flutter 版本控制fvm
1先安装 choco powershell 管理员身份运行 不会的话,先打开一个powershell 窗口 ,然后右击任务栏,选择第一个,即可进入
8 0
Android WebSocket即时通信
  HTTP与WebSocket响应方式区别   WebSocket存在的理由   我们已经有了 HTTP 协议,为什么还需要另一个协议?因为只靠Http通信有一个缺陷:通信只能由客户端发起,HTTP 协议做不到服务器主动向客户端推送信息。这种单向请求的特点,注定了如果服务器有连续的状态变化,服务端想主动通知客户端,就难以实现。因此,工程师们一直在思考,有没有更好的方法,而 WebSocket 就是这样诞生的。
7 0
Dart微基准测试第一部分
在过去的几个月里,我开始收到越来越多关于某些特定 Dart 操作性能的问题。以下是Romain Rastel在他关于提高 Flutter中 ChangeNotifier 性能的工作的背景下提出的此类问题的示例。 鉴于我的经验,我第一眼就知道这个特定的基准测试出了什么问题……但是为了讲故事,让我假装我没有。那我将如何处理这个问题? 我通常会首先尝试重复报告的数字。在这种特殊情况下,我将首先创建一个空的 Flutter 应用程序
5 0
使用APICloud AVM框架开发预约应用
前段时间跟朋友一起搞了一个预约的项目,前端用的APICloud的AVM框架做的,后端用的php开发的,用的tp5框架,没几天就搞出来了。简单跟大家分享一下开发中的一些功能点的实现吧。也欢迎大家一起探讨。
7 0
+关注
quincy
从一个小菜鸟飞升大奶牛之路,飞升路上交交朋友
37
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载