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的作用以及手 ...
随机推荐
- Vue 更换页面图标和title
1.基础的做法就是直接换掉,logo换的时候需要使用icon格式的图标 title 直接在index.html 里面把原来的title注释掉 或者直接改了就行 2. 如果需要进行相应的改变啥的 ,需要 ...
- Vue全局组件创建三种方法
<my-com1></my-com1> <my-com2></my-com2> <template id="tmp1"> ...
- oracle 11g 用户名和密码默认区分大小写
oracle 11g 用户名和密码默认区分大小写,可更改alter system set sec_case_sensitive_logon=false 设置改为不区分大小写.
- 【JavaScript数据结构系列】02-栈Stack
[JavaScript数据结构系列]02-栈Stack 码路工人 CoderMonkey 转载请注明作者与出处 ## 1. 认识栈结构 栈是非常常用的一种数据结构,与数组同属线性数据结构,不同于数组的 ...
- JVM调优总结(二)-基本垃圾回收算法
可以从不同的的角度去划分垃圾回收算法: 按照基本回收策略分 引用计数(Reference Counting): 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数. ...
- Android简单应用程序破解——runtime.apk
对于<Debugging Android Application>一文中最后附上的练习,我采用了另一种静态方法绕开原有的逻辑去破解.主要的过程如下: 利用apktool将练习的runtim ...
- win10下安装scrapy出现错误的处理
一.背景: 在win10的dos窗口下使用命令pip install scrapy安装scrapy时,出现“ error: Microsoft Visual C++ 14.0 is required. ...
- [验证码识别技术] 字符型验证码终结者-CNN+BLSTM+CTC
验证码识别(少样本,高精度)项目地址:https://github.com/kerlomz/captcha_trainer 1. 前言 本项目适用于Python3.6,GPU>=NVIDIA G ...
- 对象调用 push 方法
/* Array.prototype.push = function A(val) { this[this.length] = val; // =>this.length 在原来的基础上加1 r ...
- F5忘记密码修改教程
!!!首先查看系统版本,13版本和14版本修改密码方式不一致 首先介绍13版本修改密码 注:12版本也适用,11版本未测试,应该也可以,有问题欢迎留言) 1. 将终端连接到BIG-IP串行控制台端口. ...