Android ViewDragHelper解析

用途

ViewDragHelper类的设计决定了其适用于被包含在一个自定义ViewGroup之中,而不是对任意一个布局上的视图容器使用ViewDragHelper。在自定义的ViewGroup中,主要是帮助我们处理对子控件的拖动操作。ViewDragHelper也是framework中不为人知却非常有用的一个工具。与GestureDetector相比,ViewDragHelper优势体现在与拖动相关的手势分析方面。

原理分析

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        /**
         * 如果childrenView消耗掉事件,那么就会先走onInterceptTouchEvent方法,判
         * 断是否可以捕获,而在判断的过程中会去判断另外两个回调的方法:getViewHorizontalDragRange
         * 和getViewVerticalDragRange,只有这两个方法返回大于0的值才能正常的捕获。
         */
        return mDragger.shouldInterceptTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //处理事件会用到ViewDragHelper.Callback中的回调
        mDragger.processTouchEvent(event);
        return true;
    }

onTouchEvent()中很明显的展示了,对于触摸事件的分析交给ViewDragHelper来帮我处理,它可以帮我们解析拖动的触摸事件,处理的逻辑我们可以ViewDragHelper.Callback()中分析处理。

应用场景

仿Youtobe拖拽效果实现
仿DrawerLayout实现侧滑

主要方法介绍

ViewDragHelper相关方法介绍

mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);

设置可以跟踪的触摸边界,值有EDGE_LEFT , EDGE_RIGHT , EDGE_TOP ,EDGE_BOTTOM

ViewDragHelper.Callback中相关回调函数介绍

public boolean tryCaptureView(View child, int pointerId)

确定是否对child进行捕捉(拖动)

public int clampViewPositionHorizontal(View child, int left, int dx)

水平方向上对拖动的空间进行控制

public int clampViewPositionVertical(View child, int top, int dy)

垂直方向上对拖动的空间进行控制

public void onEdgeTouched(int edgeFlags, int pointerId) 

当设置的触摸边界被触摸到时出发

public void onEdgeDragStarted(int edgeFlags, int pointerId)

开始边界触摸,这里可以绕过tryCaptureView(),可以手动制定要拖动的控件,如mDragHelper.captureChildView(mDragView2, pointerId);

当childView可以消耗事件的时候,事件的就不会传递到ViewGroup的onTouchEvent()中,所以ViewDragHelper就不会去解析拖动的事件,要想让其解析,则需要重写以下两个回调函数

public int getViewHorizontalDragRange(View child)

childView横向的移动的范围

public int getViewVerticalDragRange(View child)

childView纵向的移动的范围

public boolean onEdgeLock()

返回true的时候会锁住当前的边界,false则unLock

public int  onViewCaptured()

当captureView被捕获时回调

public int  onViewDragStateChanged()

当ViewDragHelper状态发生变化时回调(IDLE,DRAGGING,SETTING[自动滚动时])

public int  onViewPositionChanged()

当captureview的位置发生改变时回调

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容