ViewDragHelper类的基本使用

在android的开发包android.support.v4.widget中有一个ViewDragHelper类。这个类的作用是帮助我们处理View的拖拽滑动。在一个ViewGroup类的内部定义一个ViewDragHelper,并且把onInterceptTouchEvent()和onTouchEvent()事件交给这个类去处理,这样也就免去了烦琐的事件处理判断。

1.创建实例

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处于这种状态

下面用一个例子来演示这个类的使用:

  1 package com.example.ubuntu.viewdragermotion;
  2
  3 import android.content.Context;
  4 import android.support.v4.view.MotionEventCompat;
  5 import android.support.v4.widget.ViewDragHelper;
  6 import android.util.AttributeSet;
  7 import android.view.MotionEvent;
  8 import android.view.View;
  9 import android.view.ViewGroup;
 10 import android.widget.LinearLayout;
 11
 12 /**
 13  * Created by ubuntu on 15-12-1.
 14  */
 15 public class DragerMotionLayout extends LinearLayout {
 16     private View mChild_01;
 17     private ViewDragHelper mDragHelper = null;
 18     //设置ViewDragHelper的回调方法
 19     private ViewDragHelper.Callback mCallBack = new ViewDragHelper.Callback() {
 20         @Override
 21         public boolean tryCaptureView(View child, int pointerId) {
 22             //捕获view,被捕获之后,可以跟随手指的操作
 23             return child == mChild_01;
 24         }
 25
 26         @Override
 27         public int clampViewPositionHorizontal(View child, int left, int dx) {
 28             //当用手拖动view的时候,设置view的水平方向上滑动距离
 29             final int leftPadding = child.getPaddingLeft();
 30             final int rightPadding = ((ViewGroup) child.getParent()).getWidth() - child.getWidth();
 31             return Math.min(rightPadding, Math.max(left, leftPadding));
 32         }
 33
 34         @Override
 35         public int clampViewPositionVertical(View child, int top, int dy) {
 36             //当用手拖动view的时候,设置view的垂直方向上滑动距离
 37             final int topPadding = child.getPaddingTop();
 38             final int bottomPadding = ((ViewGroup) child.getParent()).getHeight() - child.getHeight();
 39             return Math.min(bottomPadding, Math.max(top,topPadding));
 40         }
 41
 42         @Override
 43         public void onEdgeDragStarted(int edgeFlags, int pointerId) {
 44             //边缘滑动的时候,捕获view
 45             mDragHelper.captureChildView(mChild_01, pointerId);
 46         }
 47
 48         @Override
 49         public void onViewReleased(View releasedChild, float xvel, float yvel) {
 50             //设置当手指离开的时候,view应该设置的位置,调用这个方法的时候,必须保证
 51             //computeScroll()方法中使用的是ViewDragHelper.continueSettling(true)方法接管
 52             mDragHelper.settleCapturedViewAt(0,0);
 53             invalidate();
 54         }
 55     };
 56
 57     public DragerMotionLayout(Context context) {
 58         this(context, null);
 59     }
 60
 61     public DragerMotionLayout(Context context, AttributeSet attrs) {
 62         this(context, attrs, 0);
 63     }
 64
 65     public DragerMotionLayout(Context context, AttributeSet attrs, int defStyleAttr) {
 66         super(context, attrs, defStyleAttr);
 67         init();
 68     }
 69
 70     @Override
 71     protected void onFinishInflate() {
 72         super.onFinishInflate();
 73         mChild_01 = this.getChildAt(0);
 74     }
 75
 76     private void init() {
 77         //初始化ViewDragHelper
 78         mDragHelper = ViewDragHelper.create(this, 1.0f, mCallBack);
 79         //使监听左边的边缘滑动
 80         mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
 81     }
 82
 83     @Override
 84     public boolean onInterceptTouchEvent(MotionEvent ev) {
 85         int action = MotionEventCompat.getActionMasked(ev);
 86         if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
 87             mDragHelper.cancel();
 88             return false;
 89         }
 90         //ViewDragHelper接管事件的拦截
 91         return mDragHelper.shouldInterceptTouchEvent(ev);
 92     }
 93
 94
 95     @Override
 96     public boolean onTouchEvent(MotionEvent event) {
 97         //ViewDragHelper接管事件的处理
 98         mDragHelper.processTouchEvent(event);
 99         return true;
100     }
101
102     @Override
103     public void computeScroll() {
104         //如果view处于STATE_SETTLING状态下,使用该方法接管
105         if(mDragHelper.continueSettling(true)){
106             invalidate();
107         }
108     }
109 }
时间: 2024-08-27 05:21:37

ViewDragHelper类的基本使用的相关文章

ViewDragHelper详解

2013年谷歌i/o大会上介绍了两个新的layout: SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDragHelper来处理拖动.ViewDragHelper是framework中不为人知却非常有用的一个工具. ViewDragHelper解决了android中手势处理过于复杂的问题,在DrawerLayout出现之前,侧滑菜单都是由第三方开源代码实现的,其中著名的当属MenuDrawer ,Menu

Android -- ViewDragHelper

SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDragHelper来处理拖动. ViewDragHelper并不是第一个用于分析手势处理的类,gesturedetector也是,但是在和拖动相关的手势分析方面gesturedetector只能说是勉为其难. 好的特点 ViewDragHelper.Callback是连接ViewDragHelper与view之间的桥梁(这个view一般是指拥子view的容器

ViewDragHelper详解(侧滑栏)

乐观是一首激昂优美的进行曲,时刻鼓舞着你向事业的大路勇猛前进.--大仲马 一.概述 Drag拖拽:ViewDrag拖拽视图,拖拽控件:ViewDragHelper拖拽视图助手,拖拽操作类.利用ViewDragHelper类可以实现很多绚丽的效果,比如:拖拽删除,拖拽排序,侧滑栏等.本篇主要讲解简易侧滑栏的实现. 注意:ViewDragHelper是作用在一个ViewGroup上,也就是说他不能直接作用到被拖拽的控件view上, 因为控件的位置是由父控件决定的. 最终效果效果图: 二.相关概念 1

【FastDev4Android框架开发】神器ViewGragHelper完全解析之详解实现QQ5.X侧滑酷炫效果(三十四)

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50043159 本文出自:[江清清的博客] (一).前言: 这几天正在更新录制实战项目,整体框架是采用仿照QQ5.X侧滑效果的.那么我们一般的做法就是自定义ViewGroup或者采用开源项目MenuDrawer或者Google提供的控件DrawerLayout等方式来实现.这些的控件的很多效果基本上都是采用实现onInterceptTouchEvent和onTouch

Android上下左右滑动,显示底层布局

转载博客地址:http://www.cnblogs.com/flyme2012/p/4106308.html 闲着没事做了一个小东西.Android的上下左右滑动,显示底层布局.可以做类似于QQ消息列表的删除功能. 看效果: 实现基本原理: 前段时间学习了一下ViewDragHelper类,大概的就是通过这个类来控制的上下左右的滑动,方便的很多啊,也是很简单的代码,可以参考 我之前的关于ViewDragHelper的博客文章,这里面主要做的工作就是对触摸事件的传递,需要将触摸事件传递给底层的布局

第二章 控件架构与自定义控件详解 + ListView使用技巧 + Scroll分析

1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWindow将DecorView作为整个应用窗口的根View,DecorView将屏幕分成两部分:TitleView和ContentView.ContentView实际上是一个FrameLayout,里面容纳的就是我们在xml布局文件中定义的布局. 为什么调用requestWindowFeature()方法一定要在setContentView()方法调

【FastDev4Android框架开发】打造QQ6.X最新版本侧滑界面效果(三十八)

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50253925 本文出自:[江清清的博客] (一).前言: 这两天QQ进行了重大更新(6.X)尤其在UI风格上面由之前的蓝色换成了白色居多了,侧滑效果也发生了一些变化,那我们今天来模仿实现一个QQ6.X版本的侧滑界面效果.今天我们还是采用神器ViewDragHelper来实现,之前我们以前基于ViewDragHelper的使用和打造QQ5.X效果了,基本使用方法可以点

[UI]抽屉菜单DrawerLayout分析(三)

在[UI]抽屉菜单DrawerLayout分析(一)和[UI]抽屉菜单DrawerLayout分析(二)中分别介绍了DrawerLayout得基本框架结构和ViewDragerHelper的作用以及手势分发,本文一起来分析其中的Scroller的使用情况. 在ViewDragerHelper中可以发现private ScrollerCompat mScroller;说明抽屉菜单的具体滑动也是依赖于Scroller的使用,检索一下mScroller的引用,定位到forceSettleCapture

DragLayout: QQ5.0侧拉菜单的新特效

一.项目概要 1.1 项目效果如图: 1.2 需要使用到的技术   ViewDragHelper: 要实现和QQ5.0侧滑的特效,需要借助谷歌在2013年I/O大会上发布的ViewDragHelper类,提供这个类目的就是为了解决拖拽滑动问题 1.3 侧滑菜单的实现方式 1. SlidingMenu 第三方库 2. DrawerLayout v4包中的类 3. 自定义控件 1.4 一些回调方法 - tryCaptureView: 用来决定是否可以拖动 - clampViewPositionHor