关于Android View滑动的一些总结
一直都对Android的Scroll滑动一知半解的,看了下大神的博客和Android官方文档,下面是我对于AndroidView滑动的几个方法进行总结:
(一) scrollTo(x,y)与scrollBy(x,y)都能进行View的滑动,他们的区别是什么?
scrollTo(x,y):该方法是让View相对于最初始位置滚动某段距离。
例如:我要移动view到坐标点(100,100),那么我的偏移量就是(0,,0) - (100,100) = (-100 ,-100) ,我就要执行view.scrollTo(-100,-100),达到这个效果。
scrollBy(x,y) :该方法是让View相对于当前的位置滚动某段距离。
从源码中看出,它实际上是调用了scrollTo(mScrollX + x, mScrollY + y);
mScrollX + x和mScrollY + y,即表示在原先偏移的基础上在发生偏移,通俗的说就是相对我们当前位置偏移。根据父类VIEW里面移动,如果移动到了超出的地方,就不会显示。
区别:相同之处是他们都是相对于父容器的内部滑动,不同之处是如果2个方法只调用一次,那么都会滑动相同的位置,但是多次调用这2个方法区别就出来了。
scrollTo()是相对于最初始位置滑动某段距离,当第二次调用时,view的位置是不会变化的,也就是说只会滑动一次。
scrollBy()是相对于当前位置滑动某段距离,那么多次调用后,当前位置是不断会更新的,所以scrollBy()方法会让VIew持续滑动起来。
(二) Scroller中startScroll()方法
public void startScroll (int startX, int startY, int dx, int dy,int d)
以提供的起始点和将要滑动的距离开始滚动。滚动会使用缺省值250ms作为持续时间。
参数
startX: 水平方向滚动的偏移值,以像素为单位。正值表明滚动将向左滚动
startY: 垂直方向滚动的偏移值,以像素为单位。正值表明滚动将向上滚动
dx: 水平方向滑动的距离,大于0会使滚动向左滚动
dy: 垂直方向滑动的距离,大于0会使滚动向上滚动
d: 滑动持续的时间
下面介绍一下与坐标相关,容易混淆的几个方法表示的含义:
1 mScrollX:表示离视图起始位置的x水平方向的偏移量
mScrollY:表示离视图起始位置的y垂直方向的偏移量
注意:mScrollX和mScrollY指的并不是坐标,而是偏移量。
2 getWidth()方法是相对于屏幕来说控件的宽度,控件宽度大于屏幕宽度时,该值为屏幕宽度
3 getLeft() ,getRight(),getBottom(),getTop()方法的值是针对其父视图的相对位置,而不是控件相对于坐标的位置
(三) Scroller开发带有滚动的ViewGroup的流程如下
如果你使用 Scroller ,流程如下:
1.可以在自定义的布局中,按照需求初始化 Scroller 构造函数。
2.重写onInterceptTouchEvent(MotionEvent ev)方法,看看是否要拦截相关的事件。
3.重写onTouchEvent(MotionEvent event)方法,根据触摸屏上的动作使用 computeScroll()以及 scrollTo 和 scrollBy 方法 进行根据手指对布局进行滑动效果。
4.在触摸操作结束(MotionEvent.ACTION_UP)的时候,调用startScroll(int startX, int startY, int dx, int dy, int duration)方法,进行动画自动操作,来完成整个滚动流程。
在此我推荐下面2篇关于利用Scroller开发带有滚动效果的ViewGroup的博客。认真搞懂其中一个,你的理解就更深了。