ViewDragHelper类的基本使用
在android的开发包android.support.v4.widget中有一个ViewDragHelper类。这个类的作用是帮助我们处理View的拖拽滑动。在一个ViewGroup类的内部定义一个ViewDragHelper,并且把onInterceptTouchEvent()和onTouchEvent()事件交给这个类去处理,这样也就免去了烦琐的事件处理判断。
1.创建实例
public static ViewDragHelper create (ViewGroup forParent, float sensitivity, ViewDragHelper.Callback cb)
ViewDragHelper提供了这个静态方法来创建一个实例。forParent表示当前的ViewGroup,ViewDragHelper一般定义在ViewGroup中,这样这个参数也就this。 sensitivity表示敏感度,值越大越敏感,越能快速的检测到滑动,默认的正常值是1.0f。ViewDragHelper.Callback这个抽象类是核心的部分,在这个类中定义了所有的事件的处理。
2.状态
STATE_DRAGGING: view正处在被拖动的状态
STATE_IDLE: view没有被拖动或者动画已经结束的状态
STATE_SETTLING:指定了view的确定位置的时候,view处于这种状态
下面用一个例子来演示这个类的使用:
package com.example.ubuntu.viewdragermotion; import android.content.Context;
import android.support.v4.view.MotionEventCompat;
import android.support.v4.widget.ViewDragHelper;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout; /**
* Created by ubuntu on 15-12-1.
*/
public class DragerMotionLayout extends LinearLayout {
private View mChild_01;
private ViewDragHelper mDragHelper = null;
//设置ViewDragHelper的回调方法
private ViewDragHelper.Callback mCallBack = new ViewDragHelper.Callback() {
@Override
public boolean tryCaptureView(View child, int pointerId) {
//捕获view,被捕获之后,可以跟随手指的操作
return child == mChild_01;
} @Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
//当用手拖动view的时候,设置view的水平方向上滑动距离
final int leftPadding = child.getPaddingLeft();
final int rightPadding = ((ViewGroup) child.getParent()).getWidth() - child.getWidth();
return Math.min(rightPadding, Math.max(left, leftPadding));
} @Override
public int clampViewPositionVertical(View child, int top, int dy) {
//当用手拖动view的时候,设置view的垂直方向上滑动距离
final int topPadding = child.getPaddingTop();
final int bottomPadding = ((ViewGroup) child.getParent()).getHeight() - child.getHeight();
return Math.min(bottomPadding, Math.max(top,topPadding));
} @Override
public void onEdgeDragStarted(int edgeFlags, int pointerId) {
//边缘滑动的时候,捕获view
mDragHelper.captureChildView(mChild_01, pointerId);
} @Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
//设置当手指离开的时候,view应该设置的位置,调用这个方法的时候,必须保证
//computeScroll()方法中使用的是ViewDragHelper.continueSettling(true)方法接管
mDragHelper.settleCapturedViewAt(0,0);
invalidate();
}
}; public DragerMotionLayout(Context context) {
this(context, null);
} public DragerMotionLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public DragerMotionLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
} @Override
protected void onFinishInflate() {
super.onFinishInflate();
mChild_01 = this.getChildAt(0);
} private void init() {
//初始化ViewDragHelper
mDragHelper = ViewDragHelper.create(this, 1.0f, mCallBack);
//使监听左边的边缘滑动
mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
} @Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int action = MotionEventCompat.getActionMasked(ev);
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
mDragHelper.cancel();
return false;
}
//ViewDragHelper接管事件的拦截
return mDragHelper.shouldInterceptTouchEvent(ev);
} @Override
public boolean onTouchEvent(MotionEvent event) {
//ViewDragHelper接管事件的处理
mDragHelper.processTouchEvent(event);
return true;
} @Override
public void computeScroll() {
//如果view处于STATE_SETTLING状态下,使用该方法接管
if(mDragHelper.continueSettling(true)){
invalidate();
}
}
}
ViewDragHelper类的基本使用的更多相关文章
- Android -- ViewDragHelper
ViewDragHelper SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDragHelper来处理拖动. ...
- ViewDragHelper详解
2013年谷歌i/o大会上介绍了两个新的layout: SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDra ...
- ViewDragHelper详解(侧滑栏)
1.Drag拖拽:ViewDrag拖拽视图,拖拽控件:ViewDragHelper拖拽视图助手,拖拽操作类.利用ViewDragHelper类可以实现很多绚丽的效果,比如:拖拽删除,拖拽排序,侧滑栏等 ...
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- [UI]抽屉菜单DrawerLayout分析(一)
本文转载于:http://www.cnblogs.com/avenwu/archive/2014/04/16/3669367.html 侧拉菜单作为常见的导航交互控件,最开始在没有没有android官 ...
- DragLayout: QQ5.0侧拉菜单的新特效
一.项目概要 1.1 项目效果如图: 1.2 需要使用到的技术 ViewDragHelper: 要实现和QQ5.0侧滑的特效,需要借助谷歌在2013年I/O大会上发布的ViewDragHelper ...
- 《Android群英传》读书笔记 (2) 第三章 控件架构与自定义控件详解 + 第四章 ListView使用技巧 + 第五章 Scroll分析
第三章 Android控件架构与自定义控件详解 1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWin ...
- 第二章 控件架构与自定义控件详解 + ListView使用技巧 + Scroll分析
1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWindow将DecorView作为整个应用窗口的根V ...
- [UI]抽屉菜单DrawerLayout分析(三)
在[UI]抽屉菜单DrawerLayout分析(一)和[UI]抽屉菜单DrawerLayout分析(二)中分别介绍了DrawerLayout得基本框架结构和ViewDragerHelper的作用以及手 ...
随机推荐
- 【面试考】【入门】决策树算法ID3,C4.5和CART
关于决策树的purity的计算方法可以参考: 决策树purity/基尼系数/信息增益 Decision Trees 如果有不懂得可以私信我,我给你讲. ID3 用下面的例子来理解这个算法: 下图为我们 ...
- 约瑟夫环(超好的代码存档)--19--约瑟夫环--LeetCode面试题62(圆圈最后剩下的数字)
圆圈中最后剩下的数字 0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0 ...
- 【软工】[技术博客] 用Monaco Editor打造接近vscode体验的浏览器IDE
[技术博客] 用Monaco Editor打造接近vscode体验的浏览器IDE 官方文档与重要参考资料 官方demo 官方API调用样例 Playground 官方API Doc,但其搜索框不支持模 ...
- Java IO(二)File
Java IO(二)File 一.概述 在 Java 中,File 类是 java.io 包中唯一代表磁盘文件本身的对象,也就是说,如果希望在程序中操作文件和目录,则都可以通过 File 类来完成.F ...
- 节点流(文件流) FileInputStream & FileOutputStream & FileReader & FileWriter
节点流(文件流) FileInputStream(字节流)处理视频类的 FileOutputStream(字节流) FileReader(字符流)处理文本文件 ...
- ArrayList及List的常用方法
ArrayList package com.aff.coll; import java.util.ArrayList; import java.util.List; import org.junit. ...
- 小谢第7问:js前端如何实现大文件分片上传、上传进度、终止上传以及删除服务器文件?
文件上传一般有两种方式:文件流上传和base64方式上传,毫无疑问,当进行大文件上传时候,转为base64是不现实的,因此用formData方式结合文件流,直接上传到服务器 本文主要结合vue的来讲解 ...
- 如何在Spring Boot应用启动之后立刻执行一段逻辑
1. 前言 不知道你有没有接到这种需求,项目启动后立马执行一些逻辑.比如简单的缓存预热,或者上线后的广播之类等等.如果你使用 Spring Boot 框架的话就可以借助其提供的接口CommandLin ...
- Rocket - diplomacy - enumerateMask
https://mp.weixin.qq.com/s/s3hr5JJX2_pwNgdu8WqV0Q 介绍enumerateMask的实现.(仅供理解,非严谨证明) 1. 基本定义 ...
- Java实现 LeetCode 354 俄罗斯套娃信封问题
354. 俄罗斯套娃信封问题 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一 ...