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的作用以及手 ...
随机推荐
- 聊聊UDP、TCP和实现一个简单的JAVA UDP小Demo
最近真的比较忙,很久就想写了,可是一直苦于写点什么,今天脑袋灵光一闪,觉得自己再UDP方面还有些不了解的地方,所以要给自己扫盲. 好了,咱们进入今天的主题,先列一下提纲: 1. UDP是什么,UDP适 ...
- 【HTTP】Web服务器和HTTP的协作&HTTP首部
用单台虚拟主机实现多个域名 Web服务器可以搭建多个独立域名的Web网站,也可以作为通信路径上的中转服务器提升效率. HTTP/1.1规范允许一台HTTP服务器搭建多个Web站点,提供Web托管服务的 ...
- 关于做好ASO工作的十点有效建议
导语: 互联网上关于如何做好ASO的内容多种多样,鱼目混珠.有从数据分析角度的方法论:有从运营工具角度的方法论:也有从实践角度看如何做好的. 本文将“对症下药”,从影响ASO的十大因素出发,整理出一份 ...
- python2.7入门 01
进入python官网 http://www.python.org/download/ 下载python2.7.x 版 下载安装后配置环境变量 在path中——>>>把安装路 ...
- PMP 冲!|项目整合管理
0x00概述 项目管理包括识别.定义.组合.统一与协调各项目管理过程组的过程及项目管理活动.包括在各个项目冲突的目标与方案之间进行权衡和选择. 整合管理包括进行如下选择: 资源分配: 平衡竞争性需求: ...
- AUTOSAR-文档中所使用的UML文件
https://mp.weixin.qq.com/s/OeUPNBVh1Vd_ZT1EZVKDZA AUTOSAR官方对AUTOSAR的了解,自然比我们的了解多.在这样一个信息不对称的情况下,需要 ...
- Java实现洛谷 P1062 数列
P1062 数列 import java.util.ArrayList; import java.util.Scanner; public class Main { public static voi ...
- Java实现 基础算法 水仙花数
public class 水仙花数 { public static void main(String[] args) { for (int i = 100; i < 1000; i++) { i ...
- java实现古堡算式
** 古堡算式** 福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA 他对华生说:"ABCDE应该代表不同的数字,问号也代表某个数字!" 华生 ...
- 【工作Vlog】Jmeter响应结果乱码解决方案
资料:https://blog.51cto.com/ydhome/1864340 方法一:使用后置控制器"Beanshell PostProcessor"(动态修改,灵活) 添加后 ...