Android自定义View(二)——常用工具

来源:互联网 发布:陈坤孩子的母亲知乎 编辑:程序博客网 时间:2024/05/22 13:13

本文转载自:http://blog.csdn.net/tyk0910/article/details/53084260

在自定义View的时候,常常会用到一些Android系统提供的工具。这些工具封装了我们经常会用到的方法,比如拖拽View,计算滑动速度,View的滚动,手势处理等等。如果我们自己去实现这些方法会比较繁琐,而且容易出一些bug。所以了解熟悉这些常用的工具,对我们后续的学习和工作有很大帮助。

Configuration:

Configuration用来描述设备的配置信息。比如用户的配置信息:locale和scaling等等 ,比如设备的相关信息:输入模式,屏幕大小, 屏幕方向等等。

我们可以采用如下方式来获取需要的相关信息:

<code class="hljs cs has-numbering">Configuration configuration=getResources().getConfiguration();<span class="hljs-comment">//获取国家码</span><span class="hljs-keyword">int</span> countryCode=configuration.mcc;<span class="hljs-comment">//获取网络码</span><span class="hljs-keyword">int</span> networkCode=configuration.mnc;<span class="hljs-comment">//判断横竖屏</span><span class="hljs-keyword">if</span>(configuration.orientation==Configuration.ORIENTATION_PORTRAIT){   } <span class="hljs-keyword">else</span> {}</code><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

ViewConfiguration:

ViewConfiguration提供了一些自定义控件用到的标准常量,比如尺寸大小,滑动距离,敏感度等等。

可以利用ViewConfiguration的静态方法获取一个实例

ViewConfiguration viewConfiguration=ViewConfiguration.get(context);

介绍ViewConfiguration的几个对象方法:

<code class="hljs cs has-numbering">ViewConfiguration  viewConfiguration=ViewConfiguration.<span class="hljs-keyword">get</span>(context);<span class="hljs-comment">//获取touchSlop。该值表示系统所能识别出的被认为是滑动的最小距离</span><span class="hljs-keyword">int</span> touchSlop = viewConfiguration.getScaledTouchSlop();<span class="hljs-comment">//获取Fling速度的最小值和最大值</span><span class="hljs-keyword">int</span> minimumVelocity = viewConfiguration.getScaledMinimumFlingVelocity();<span class="hljs-keyword">int</span> maximumVelocity = viewConfiguration.getScaledMaximumFlingVelocity();<span class="hljs-comment">//判断是否有物理按键</span>boolean isHavePermanentMenuKey=viewConfiguration.hasPermanentMenuKey();<span class="hljs-comment">//双击间隔时间.在该时间内是双击,否则是单击</span><span class="hljs-keyword">int</span> doubleTapTimeout=ViewConfiguration.getDoubleTapTimeout();<span class="hljs-comment">//按住状态转变为长按状态需要的时间</span><span class="hljs-keyword">int</span> longPressTimeout=ViewConfiguration.getLongPressTimeout();<span class="hljs-comment">//重复按键的时间</span><span class="hljs-keyword">int</span> keyRepeatTimeout=ViewConfiguration.getKeyRepeatTimeout();</code>

GestureDetector:

GestureDetector是Android给我们提供的一个手势处理的工具,利用GestureDetector可以简化许多操作,轻松实现一些常用的功能。

一起看看怎么使用的:

第一步:实现OnGestureListener

<code class="hljs java has-numbering"><span class="hljs-keyword">private</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">GestureListenerImpl</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">GestureDetector</span>.<span class="hljs-title">OnGestureListener</span> {</span>        <span class="hljs-comment">//触摸屏幕时均会调用该方法</span>        <span class="hljs-annotation">@Override</span>        <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onDown</span>(MotionEvent e) {            System.out.println(<span class="hljs-string">"---> 手势中的onDown方法"</span>);            <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;        }        <span class="hljs-comment">//手指在屏幕上拖动时会调用该方法</span>        <span class="hljs-annotation">@Override</span>        <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onFling</span>(MotionEvent e1,MotionEvent e2, <span class="hljs-keyword">float</span> velocityX,<span class="hljs-keyword">float</span> velocityY) {            System.out.println(<span class="hljs-string">"---> 手势中的onFling方法"</span>);            <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;        }        <span class="hljs-comment">//手指长按屏幕时均会调用该方法</span>        <span class="hljs-annotation">@Override</span>        <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onLongPress</span>(MotionEvent e) {            System.out.println(<span class="hljs-string">"---> 手势中的onLongPress方法"</span>);        }        <span class="hljs-comment">//手指在屏幕上滚动时会调用该方法</span>        <span class="hljs-annotation">@Override</span>        <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onScroll</span>(MotionEvent e1,MotionEvent e2, <span class="hljs-keyword">float</span> distanceX,<span class="hljs-keyword">float</span> distanceY) {            System.out.println(<span class="hljs-string">"---> 手势中的onScroll方法"</span>);            <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;        }        <span class="hljs-comment">//手指在屏幕上按下,且未移动和松开时调用该方法</span>        <span class="hljs-annotation">@Override</span>        <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onShowPress</span>(MotionEvent e) {            System.out.println(<span class="hljs-string">"---> 手势中的onShowPress方法"</span>);        }        <span class="hljs-comment">//轻击屏幕时调用该方法</span>        <span class="hljs-annotation">@Override</span>        <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onSingleTapUp</span>(MotionEvent e) {            System.out.println(<span class="hljs-string">"---> 手势中的onSingleTapUp方法"</span>);            <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;        }    }</code>

第二步:生成GestureDetector对象

GestureDetector gestureDetector = new GestureDetector(context,new
GestureListenerImpl());

这里的GestureListenerImpl就是GestureListener监听器的实现。

第三步:将Touch事件交给GestureDetector处理
比如将Activity的Touch事件交给GestureDetector处理

<code class="hljs cs has-numbering">@Override  <span class="hljs-keyword">public</span> boolean <span class="hljs-title">onTouchEvent</span>(MotionEvent <span class="hljs-keyword">event</span>) {       <span class="hljs-keyword">return</span> mGestureDetector.onTouchEvent(<span class="hljs-keyword">event</span>);  } </code>

比如将View的Touch事件交给GestureDetector处理

<code class="hljs cs has-numbering">mButton=(Button) findViewById(R.id.button);  mButton.setOnTouchListener(<span class="hljs-keyword">new</span> OnTouchListener() {               @Override     <span class="hljs-keyword">public</span> boolean <span class="hljs-title">onTouch</span>(View arg0, MotionEvent <span class="hljs-keyword">event</span>) {            <span class="hljs-keyword">return</span> mGestureDetector.onTouchEvent(<span class="hljs-keyword">event</span>);        }  });</code>

VelocityTracker :

VelocityTracker用于跟踪触摸屏事件(比如,Flinging及其他Gestures手势事件等)的速率。

第一步:开始速度追踪

<code class="hljs cs has-numbering"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">startVelocityTracker</span>(MotionEvent <span class="hljs-keyword">event</span>) {      <span class="hljs-keyword">if</span> (mVelocityTracker == <span class="hljs-keyword">null</span>) {           mVelocityTracker = VelocityTracker.obtain();       }       mVelocityTracker.addMovement(<span class="hljs-keyword">event</span>);  } </code>

在这里我们初始化VelocityTracker,并且把要追踪的MotionEvent注册到VelocityTracker的监听中。

第二步:获取追踪到的速度

<code class="hljs cs has-numbering"><span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getScrollVelocity</span>() {       <span class="hljs-comment">// 设置VelocityTracker单位.1000表示1秒时间内运动的像素  </span>     mVelocityTracker.computeCurrentVelocity(<span class="hljs-number">1000</span>);       <span class="hljs-comment">// 获取在1秒内X方向所滑动像素值  </span>     <span class="hljs-keyword">int</span> xVelocity = (<span class="hljs-keyword">int</span>) mVelocityTracker.getXVelocity();       <span class="hljs-keyword">return</span> Math.abs(xVelocity);      } </code>

同理可以获取1秒内Y方向所滑动像素值

第三步:解除速度追踪

<code class="hljs cs has-numbering"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">stopVelocityTracker</span>() {        <span class="hljs-keyword">if</span> (mVelocityTracker != <span class="hljs-keyword">null</span>) {            mVelocityTracker.recycle();            mVelocityTracker = <span class="hljs-keyword">null</span>;        }  }</code>

Scroller:

Scroller挺常见的,用的比较多了。在此只强调几个重要的问题,别的就不再赘述了。

第一点:scrollTo()和scrollBy()的关系
先看scrollBy( )的源码

<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">scrollBy</span>(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y) {          scrollTo(mScrollX + x, mScrollY + y);   } </code>

这就是说scrollBy( )调用了scrollTo( ),最终起作用的是scrollTo( )方法。

第二点:scroll的本质
scrollTo( )和scrollBy( )移动的只是View的内容,而且View的背景是不移动的。

第三点:scrollTo( )和scrollBy( )方法的坐标说明

比如我们对于一个TextView调用scrollTo(0,25) ;那么该TextView中的content(比如显示的文字:Hello)会怎么移动呢?
向下移动25个单位?不!恰好相反!!这是为什么呢?
因为调用该方法会导致视图重绘,即会调用

public void invalidate(int l, int t, int r, int b)

此处的l,t,r,b四个参数就表示View原来的坐标.
在该方法中最终会调用:

tmpr.set(l - scrollX, t - scrollY, r - scrollX, b - scrollY);
p.invalidateChild(this, tmpr);

其中tmpr是一个Rect,this是原来的View;通过这两行代码就把View在一个Rect中重绘。
请注意第一行代码:
原来的l和r均减去了scrollX
原来的t和b均减去了scrollY
就是说scrollX如果是正值,那么重绘后的View的宽度反而减少了;反之同理
就是说scrollY如果是正值,那么重绘后的View的高度反而减少了;反之同理
所以,TextView调用scrollTo(0,25)和我们的理解相反

ViewDragHelper:

在项目中很多场景需要用户手指拖动其内部的某个View,此时就需要在onInterceptTouchEvent()和onTouchEvent()这两个方法中写不少逻辑了,比如处理:拖拽移动,越界,多手指的按下,加速度检测等等。
ViewDragHelper可以极大的帮我们简化类似的处理,它提供了一系列用于处理用户拖拽子View的辅助方法和与其相关的状态记录。比较常见的:QQ侧滑菜单,Navigation Drawer的边缘滑动,都可以由它实现。

ViewDragHelper的使用并不复杂,在此通过一个示例展示其常用的用法。

<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyLinearLayout</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">LinearLayout</span> {</span>    <span class="hljs-keyword">private</span> ViewDragHelper mViewDragHelper;    <span class="hljs-keyword">public</span> <span class="hljs-title">MyLinearLayout</span>(Context context, AttributeSet attrs) {        <span class="hljs-keyword">super</span>(context, attrs);        initViewDragHelper();    }    <span class="hljs-comment">//初始化ViewDragHelper</span>    <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">initViewDragHelper</span>() {        mViewDragHelper = ViewDragHelper.create(<span class="hljs-keyword">this</span>, <span class="hljs-number">1.0</span>f, <span class="hljs-keyword">new</span> ViewDragHelper.Callback() {            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">tryCaptureView</span>(View child, <span class="hljs-keyword">int</span> pointerId) {                <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;            }            <span class="hljs-comment">//处理水平方向的越界</span>            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">clampViewPositionHorizontal</span>(View child, <span class="hljs-keyword">int</span> left, <span class="hljs-keyword">int</span> dx) {                <span class="hljs-keyword">int</span> fixedLeft;                View parent = (View) child.getParent();                <span class="hljs-keyword">int</span> leftBound = parent.getPaddingLeft();                <span class="hljs-keyword">int</span> rightBound = parent.getWidth() - child.getWidth() - parent.getPaddingRight();                <span class="hljs-keyword">if</span> (left < leftBound) {                    fixedLeft = leftBound;                } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (left > rightBound) {                    fixedLeft = rightBound;                } <span class="hljs-keyword">else</span> {                    fixedLeft = left;                }                <span class="hljs-keyword">return</span> fixedLeft;            }            <span class="hljs-comment">//处理垂直方向的越界</span>            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">clampViewPositionVertical</span>(View child, <span class="hljs-keyword">int</span> top, <span class="hljs-keyword">int</span> dy) {                <span class="hljs-keyword">int</span> fixedTop;                View parent = (View) child.getParent();                <span class="hljs-keyword">int</span> topBound = getPaddingTop();                <span class="hljs-keyword">int</span> bottomBound = getHeight() - child.getHeight() - parent.getPaddingBottom();                <span class="hljs-keyword">if</span> (top < topBound) {                    fixedTop = topBound;                } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (top > bottomBound) {                    fixedTop = bottomBound;                } <span class="hljs-keyword">else</span> {                    fixedTop = top;                }                <span class="hljs-keyword">return</span> fixedTop;            }            <span class="hljs-comment">//监听拖动状态的改变</span>            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onViewDragStateChanged</span>(<span class="hljs-keyword">int</span> state) {                <span class="hljs-keyword">super</span>.onViewDragStateChanged(state);                <span class="hljs-keyword">switch</span> (state) {                    <span class="hljs-keyword">case</span> ViewDragHelper.STATE_DRAGGING:                        System.out.println(<span class="hljs-string">"STATE_DRAGGING"</span>);                        <span class="hljs-keyword">break</span>;                    <span class="hljs-keyword">case</span> ViewDragHelper.STATE_IDLE:                        System.out.println(<span class="hljs-string">"STATE_IDLE"</span>);                        <span class="hljs-keyword">break</span>;                    <span class="hljs-keyword">case</span> ViewDragHelper.STATE_SETTLING:                        System.out.println(<span class="hljs-string">"STATE_SETTLING"</span>);                        <span class="hljs-keyword">break</span>;                }            }            <span class="hljs-comment">//捕获View</span>            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onViewCaptured</span>(View capturedChild, <span class="hljs-keyword">int</span> activePointerId) {                <span class="hljs-keyword">super</span>.onViewCaptured(capturedChild, activePointerId);                System.out.println(<span class="hljs-string">"ViewCaptured"</span>);            }            <span class="hljs-comment">//释放View</span>            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onViewReleased</span>(View releasedChild, <span class="hljs-keyword">float</span> xvel, <span class="hljs-keyword">float</span> yvel) {                <span class="hljs-keyword">super</span>.onViewReleased(releasedChild, xvel, yvel);                System.out.println(<span class="hljs-string">"ViewReleased"</span>);            }        });    }    <span class="hljs-comment">//将事件拦截交给ViewDragHelper处理</span>    <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onInterceptTouchEvent</span>(MotionEvent ev) {        <span class="hljs-keyword">return</span> mViewDragHelper.shouldInterceptTouchEvent(ev);    }    <span class="hljs-comment">//将Touch事件交给ViewDragHelper处理</span>    <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onTouchEvent</span>(MotionEvent ev) {        mViewDragHelper.processTouchEvent(ev);        <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;    }}</code><ul class="pre-numbering"><li><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyLinearLayout</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">LinearLayout</span> {</span>    <span class="hljs-keyword">private</span> ViewDragHelper mViewDragHelper;    <span class="hljs-keyword">public</span> <span class="hljs-title">MyLinearLayout</span>(Context context, AttributeSet attrs) {        <span class="hljs-keyword">super</span>(context, attrs);        initViewDragHelper();    }    <span class="hljs-comment">//初始化ViewDragHelper</span>    <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">initViewDragHelper</span>() {        mViewDragHelper = ViewDragHelper.create(<span class="hljs-keyword">this</span>, <span class="hljs-number">1.0</span>f, <span class="hljs-keyword">new</span> ViewDragHelper.Callback() {            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">tryCaptureView</span>(View child, <span class="hljs-keyword">int</span> pointerId) {                <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;            }            <span class="hljs-comment">//处理水平方向的越界</span>            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">clampViewPositionHorizontal</span>(View child, <span class="hljs-keyword">int</span> left, <span class="hljs-keyword">int</span> dx) {                <span class="hljs-keyword">int</span> fixedLeft;                View parent = (View) child.getParent();                <span class="hljs-keyword">int</span> leftBound = parent.getPaddingLeft();                <span class="hljs-keyword">int</span> rightBound = parent.getWidth() - child.getWidth() - parent.getPaddingRight();                <span class="hljs-keyword">if</span> (left < leftBound) {                    fixedLeft = leftBound;                } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (left > rightBound) {                    fixedLeft = rightBound;                } <span class="hljs-keyword">else</span> {                    fixedLeft = left;                }                <span class="hljs-keyword">return</span> fixedLeft;            }            <span class="hljs-comment">//处理垂直方向的越界</span>            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">clampViewPositionVertical</span>(View child, <span class="hljs-keyword">int</span> top, <span class="hljs-keyword">int</span> dy) {                <span class="hljs-keyword">int</span> fixedTop;                View parent = (View) child.getParent();                <span class="hljs-keyword">int</span> topBound = getPaddingTop();                <span class="hljs-keyword">int</span> bottomBound = getHeight() - child.getHeight() - parent.getPaddingBottom();                <span class="hljs-keyword">if</span> (top < topBound) {                    fixedTop = topBound;                } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (top > bottomBound) {                    fixedTop = bottomBound;                } <span class="hljs-keyword">else</span> {                    fixedTop = top;                }                <span class="hljs-keyword">return</span> fixedTop;            }            <span class="hljs-comment">//监听拖动状态的改变</span>            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onViewDragStateChanged</span>(<span class="hljs-keyword">int</span> state) {                <span class="hljs-keyword">super</span>.onViewDragStateChanged(state);                <span class="hljs-keyword">switch</span> (state) {                    <span class="hljs-keyword">case</span> ViewDragHelper.STATE_DRAGGING:                        System.out.println(<span class="hljs-string">"STATE_DRAGGING"</span>);                        <span class="hljs-keyword">break</span>;                    <span class="hljs-keyword">case</span> ViewDragHelper.STATE_IDLE:                        System.out.println(<span class="hljs-string">"STATE_IDLE"</span>);                        <span class="hljs-keyword">break</span>;                    <span class="hljs-keyword">case</span> ViewDragHelper.STATE_SETTLING:                        System.out.println(<span class="hljs-string">"STATE_SETTLING"</span>);                        <span class="hljs-keyword">break</span>;                }            }            <span class="hljs-comment">//捕获View</span>            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onViewCaptured</span>(View capturedChild, <span class="hljs-keyword">int</span> activePointerId) {                <span class="hljs-keyword">super</span>.onViewCaptured(capturedChild, activePointerId);                System.out.println(<span class="hljs-string">"ViewCaptured"</span>);            }            <span class="hljs-comment">//释放View</span>            <span class="hljs-annotation">@Override</span>            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onViewReleased</span>(View releasedChild, <span class="hljs-keyword">float</span> xvel, <span class="hljs-keyword">float</span> yvel) {                <span class="hljs-keyword">super</span>.onViewReleased(releasedChild, xvel, yvel);                System.out.println(<span class="hljs-string">"ViewReleased"</span>);            }        });    }    <span class="hljs-comment">//将事件拦截交给ViewDragHelper处理</span>    <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onInterceptTouchEvent</span>(MotionEvent ev) {        <span class="hljs-keyword">return</span> mViewDragHelper.shouldInterceptTouchEvent(ev);    }    <span class="hljs-comment">//将Touch事件交给ViewDragHelper处理</span>    <span class="hljs-annotation">@Override</span>    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onTouchEvent</span>(MotionEvent ev) {        mViewDragHelper.processTouchEvent(ev);        <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;    }}</li></ul>

从这个例子可以看出来ViewDragHelper是作用在ViewGroup上的(比如LinearLayout)而不是直接作用到某个被拖拽的子View。其实这也不难理解,因为子View在布局中的位置是其所在的ViewGroup决定的。

在该例中ViewDragHelper做了如下主要操作:

(1) ViewDragHelper接管了ViewGroup的事件拦截
(2) ViewDragHelper接管了ViewGroup的Touch事件
(3) ViewDragHelper处理了拖拽子View时的边界越界
(4) ViewDragHelper监听拖拽子View时的状态变化

除了这些常见的操作,ViewDragHelper还可以实现:抽屉拉伸,拖拽结束松手后子View自动返回到原位等复杂操作。

接下来会带来几个自定义View的实战,下一篇文章见~~~

1 0
原创粉丝点击