zoukankan      html  css  js  c++  java
  • ViewDragHelper

    参考:Android 之 ViewDragHelper 详解

         Android 之 ViewDragHelper详解(二)

    看了几篇博客,并参考了上面的两篇博客,整理一下ViewDragHelper相关的知识点,便于以后查看。

    一、自定义对象中需要做的操作

    1、使用ViewDragHelper.create静态方法创建ViewDragHelper对象。

    2、重写自定义控件中的onInterceptTouchEvent(调用ViewDragHelper对象的shouldInterceptTouchEvent)和onTouchEvent(调用processTouchEvent)方法。

    二、Callback中的方法说明

    1、clampViewPositionHorizontal和clampViewPositionVertical方法,不能返回0,否则将不能滑动

    2、tryCaptureView方法,用于判断自定义控件的子控件中,那些可以滑动,那些不允许滑动

    3、getOrderedChildIndex方法,默认返回的index就是传入的index。可以用这个方法实现子控件的重新排序。如果几个子控件在相互覆盖,可以使用这个方法确认几个控件的层次。

    4、getViewHorizontalDragRange和getViewVerticalDragRange方法,默认返回0,如果子控件是Button等可以Click的控件,则无法拖拽。只有返回非0,Button这样的控件才能拖拽。

    三、Callback中的回调方法

    1、onViewPositionChanged,View位置变化了。可以在这个回调方法中,修改View的大小,实现QQ的效果。

    2、onViewReleased,手指抬起的时候,会释放View。

    3、onEdgeTouched,触摸到边缘的时候

    4、onEdgeDragStarted,当触摸了边缘,并且正在MOVE的时候。

    5、onViewCaptured,captureChildView调用的时候,这个方法会回调。

    6、onViewDragStateChanged,拖拽状态(STATE_IDLE,STATE_DRAGGING,STATE_SETTLING[自动滚动],分别对应0,1,2)发生改变时回调。

    7、onEdgeLock,默认不需要修改。处理比较极端的问题时候才会用到。比如:如果我从左到右滑动,却出现了,y方向滑动的距离的一半比x方向滑动的距离还要大

    四、ViewDragHelper中比较常用的方法

    1、shouldInterceptTouchEvent,在自定义控件中的onInterceptTouchEvent中调用

    2、processTouchEvent,在自定义空间中的onTouchEvent中调用

    3、continueSettling,当ViewDragHelper的状态是STATE_SETTLING(自动滚动)时,该方法会将子控件自动进行移动(使用Scroller实现测量空前当前应该处于的位置,然后调用View.offsetLeftAndRight和View.offsetTopAndBottom方法进行移动)。在自定义控件中的computeScroll方法中调用。computeScroll方法用于处理自动移动的状况,通常是在MONTIONEVENT.ACTION_UP的时候,调用Scroller.startScroll方法。

    4、smoothSlideViewTo,将子控件平滑移动到指定位置。它调用了forceSettleCapturedViewAt,在forceSettleCapturedViewAt中会调用Scroller.startScroll方法。

    5、settleCapturedViewAt,将子控件移动到指定位置。与smoothSlideViewTo相似,它也调用了forceSettleCapturedViewAt方法。与smoothSlideViewTo不同的是,它以手指离开时的速度为初速度,将子控件移动到指定位置。

    6、captureChildView方法,将指定的子控件移动到指定位置。与上面两个方法不同的是,它直接移动到指定位置,不会有时间上的等待,也就是说不会有那种平滑的感觉。

    7、flingCapturedView方法,与settleCapturedViewAt类似,都使用了手指离开时的速度作为计算的当前位置的依据。

    8、cancel方法,取消此次移动,后续操作不进行。

    9、abort方法,会调用cancel,但是调用了Scroller的abort方法,直接将子控件移动到指定位置,去除中间过程。

    另外需要说明一点:

      原本以为continueSettling方法也是使用scrollTo来实现View的滑动效果(SlidingMenu使用的是scrollTo方法)。但是看源代码发现,continueSettling方法调用的是View.offsetLeftAndRight和offsetTopAndBottom方法来实现滑动效果。ViewDragHelper中另一个方法dragTo,同样使用的是offsetLeftAndRight实现滑动,而dragTo只在processTouchEvent的ACTION_MOVE中调用。

      通过阅读代码可以发现,scrollTo和scrollBy方法修改的是View类的mScrollX和mScrollY成员变量(源码中的注释表明这两个成员变量用于记录view中内容移动的距离);而offsetTopAndBottom和offsetLeftAndRight修改的是mTop、mBottom和mLeft、mRight成员变量(这四个变量表示view距离它的父控件的top和left的距离)。通过代码可以验证注释中的内容。

  • 相关阅读:
    Git Cannot rebase: You have unstaged changes.
    importError: DLL load failed when import matplotlib.pyplot as plt
    install tushare in python 3.6
    pd.qcut, pd.cut, df.groupby()等在分组和聚合方面的应用
    从池子里的beta看秋香, 个性迥异
    个股和股票池的beta系数的估算
    检验两个随机序列的beta系数
    spyder里的"查找文件里的特定字符串"非常方便
    地图上道路编号中的G S X Y
    场内的代码表, 感觉水很深
  • 原文地址:https://www.cnblogs.com/huanyou/p/5760309.html
Copyright © 2011-2022 走看看