ViewDragHelper是用来移动ViewGroup中子View的,之前写View的移动都是通过scrollTo来实现,但是它移动的是VIew中的内容,ViewGroup中的所有的子View都会移动,我一直在找能够移动子View的方法。在Google的IO大会上,发布的DrawerLayout和SlidingPaneLayout,其内部实现都是使用的ViewDragHelper实现的。
 
首先使用方法:
1.ViewDragHelper不能被new出来,是通过
   private void init(Context context){
        mDragHelper = ViewDragHelper.create(this, 0.2f, new DragHelperCallback());

}

创建出来的。
 
2.在ViewGroup中的打断触摸事件的方法中:由ViewDragHelper自己来判断是否去打断触摸事件。

@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
      if (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP) {
          mDragHelper.cancel();
          return false;
      }
      return mDragHelper.shouldInterceptTouchEvent(ev);

}

 
3. 在ViewGroup的触摸事件中:
 @Override
    public boolean onTouchEvent(MotionEvent ev) {
      mDragHelper.processTouchEvent(ev);
      return true;

}

4.整个手势的识别通过ViewDragHelper自己完成,然后自己回调自己的接口,通过接口来完成相应的动作:
class DragHelperCallback extends Callback{
 
        @Override
        public boolean tryCaptureView(View arg0, int arg1) {
            System.out.println("positionID=="+arg1);
            return arg0 == getTopView();
        }
        
        @Override
        public int clampViewPositionHorizontal(View child, int left, int dx) {
             final int leftBound = getPaddingLeft();
             final int rightBound = getWidth() - getTopView().getWidth();
             final int newLeft = Math.min(Math.max(left, leftBound), rightBound);
             return newLeft;
        }
        
         @Override
            public int clampViewPositionVertical(View child, int top, int dy) {
                    final int topBound = getPaddingTop();
                    final int bottomBound = getHeight() - getTopView().getHeight();
                    final int newTop = Math.min(Math.max(top, topBound), bottomBound);
                    return newTop;
            }
          

}

 
private View getTopView(){
        return getChildAt(1);
    }
    
    private View getBottomView(){
        return getChildAt(0);

}

 
这里处理的是左右滑动的事件。
 
简单的使用就是这样的。先上一下Demo的效果图:
 
 

 
 
ViewDragHelper封装了手势,大大的简化了很多的手势处理。
我参照别人的博客和Demo,自己实现了相同的效果,在下一篇博客中,放出源码。边学边练。
 
 
 
 
 
 
 
我的github地址:https://github.com/flyme2012
我的博客地址:http://www.cnblogs.com/flyme2012/

android 学习之ViewDragHelper的更多相关文章

  1. Android学习路线总结,绝对干货

    title: Android学习路线总结,绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一.前言 不 ...

  2. Android 学习资源

    下面这些资源对Android开发来说是很有帮助的! 最常用的: Android开发官方网站:http://developer.android.com/index.html 这个网站应该是Android ...

  3. Android学习资料收集

    1.Android 学习之路 http://stormzhang.com/android/2014/07/07/learn-android-from-rookie/

  4. Android学习——第一个NDK程序

    在前面的学习中,我们已经讲解了关于NDK编程的环境搭建流程,简单的使用我们也通过官网本身自带的例子进行说明了.可是相信大家一定还存在这么的一个疑惑:“如果我要自己利用NDK编写一个Android应用, ...

  5. Android学习——windows下搭建Cygwin环境

    在上一篇博文<Android学习——windows下搭建NDK_r9环境>中,我们详细的讲解了在windows下进行Android NDK开发环境的配置,我们也讲到了在NDk r7以后,我 ...

  6. Android学习——windows下搭建NDK_r9环境

    1. NDK(Native Development Kit) 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP功能开发的工具,通过这个 ...

  7. Android学习第三天-打包常用命令

    在前面<Android学习第一天-adb常用命令>和 <Android学习第二天-android常用命令>两篇博文中,我们重点讲解了adb和android的常用命令,下面我们讲 ...

  8. 【Android学习】《Android开发视频教程》第一季笔记

    视频地址: http://study.163.com/course/courseMain.htm?courseId=207001 课时5    Activity基础概念 1.Android开发技术结构 ...

  9. Android 学习资料收集

    收集整理这份资料灵感来自于 trip_to_iOS, 征得同意引用了该资料的开头描述 收集整理这份资料主要帮助初学者学习 Android 开发, 希望能快速帮助到他们快速入门, 找到适合自己学习资料, ...

随机推荐

  1. 资深专家深度剖析Kubernetes API Server第2章(共3章)

    欢迎来到深入学习Kubernetes API Server的系列文章的第二部分.在上一部分中我们对APIserver总体,相关术语及request请求流进行探讨说明.在本部分文章中,我们主要聚焦于探究 ...

  2. 项目笔记《DeepLung:Deep 3D Dual Path Nets for Automated Pulmonary Nodule Detection and Classification》(三)(上)结果评估

    在(一)中,我将肺结节检测项目总结为三阶段,这里我要讲讲这个项目的第三阶段,至于第二阶段,由于数据增强部分的代码我始终看不大懂,先不讲. 结果评估的程序在evaluationScript文件夹下,这个 ...

  3. java读取配置到Hash表里

    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; im ...

  4. Linux网络编程基础

    1. Linux网络模型 ① OSI七层模型和Linux四层模型 ② 各种协议之间的关系及在Linux模型中的位置 ③ 协议封装:各种协议处于一种层层封装的关系 (1)Ethernet (2)IP * ...

  5. python3 提取http请求response中的某个值

    在使用python3 request做接口测试的时候,想获取response的json中的某个值做断言时,发现request好像没有相关的方法 所以只好自己找写一个了.在我看来,json就是一个字典, ...

  6. docker(3)docker下的centos7下安装jdk

    1.将jdk-8u65-linux-x64.tar.gz文件传到docker的宿主机上 rz 2.将宿主机上的jdk-8u65-linux-x64.tar.gz复制到centos7的容器下 #在宿主机 ...

  7. 使用springmvc时处理404的方法

    使用springmvc时处理404的方法 来源: https://www.cnblogs.com/handsome-man/p/5519439.html,再次申明不是我原创的,尊重原创 如何定义404 ...

  8. ztree 获取最下级的子节点内容

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. oracle_expdp_help

    [oracle@ctp ~]$ expdp -help Export: Release 11.2.0.3.0 - Production on Thu Feb 28 13:52:15 2019 Copy ...

  10. 晶振电路的设计-AN2867学习

    一 石英晶体的等效电路.带宽: FS~FA之间就是并联带宽,越窄稳定性越好.其中Fs.Fa为Lm/Rm/Cm电抗分别为0和无穷大时的谐振频率).Fp为工作频率(通过调整负载电容CL来达到中心频率) 起 ...