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

简介: 转载请标明地址 QuincySx: http://www.jianshu.com/p/e19a8735b123ViewDragHelper是用于编写自定义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

目录
相关文章
|
2月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
87 0
|
22天前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
24天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
30 5
|
2月前
|
缓存 数据处理 Android开发
在 Android 中使用 RxJava 更新 View
【10月更文挑战第20天】使用 RxJava 来更新 View 可以提供更优雅、更高效的解决方案。通过合理地运用操作符和订阅机制,我们能够轻松地处理异步数据并在主线程中进行 View 的更新。在实际应用中,需要根据具体情况进行灵活运用,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在 Android 中使用 RxJava 更新 View 的技巧和方法,为开发高质量的 Android 应用提供有力支持。
|
2月前
|
缓存 调度 Android开发
Android 在子线程更新 View
【10月更文挑战第21天】在 Android 开发中,虽然不能直接在子线程更新 View,但通过使用 Handler、AsyncTask 或 RxJava 等方法,可以实现子线程操作并在主线程更新 View 的目的。在实际应用中,需要根据具体情况选择合适的方法,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在子线程更新 View 的技巧和方法,为开发高质量的 Android 应用提供支持。
32 2
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
25 2
|
2月前
|
XML 前端开发 Android开发
Android View的绘制流程和原理详细解说
Android View的绘制流程和原理详细解说
39 3
|
2月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
4月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
View的绘制和事件处理是两个重要的主题,上一篇《图解 Android事件分发机制》已经把事件的分发机制讲得比较详细了,这一篇是针对View的绘制,View的绘制如果你有所了解,基本分为measure、layout、draw 过程,其中比较难理解就是measure过程,所以本篇文章大幅笔地分析measure过程,相对讲得比较详细,文章也比较长,如果你对View的绘制还不是很懂,对measure过程掌握得不是很深刻,那么耐心点,看完这篇文章,相信你会有所收获的。
122 3