原文链接 http://sparkyuan.me/ 转载请注明出处
介绍
弹性滑动也就是渐进式滑动,实现弹性滑动的方法有很多,但是他们都有一个共同的思想:将一次大的滑动分成若干次小的滑动并在一段时间内完成。本文主要介绍三种弹性滑动方式,Scroller、动画和Handler。
本文中的“滑动”是指View内容的滑动而非View本身位置的改变。
示例
点击屏幕任意地方,手指与屏幕接触时,触发ACTION_DOWN屏幕中的文字会向上滑动400px,手指离开屏幕时触发ACTION_UP文字下滑400px。
基础知识补充
- View的宽高和坐标关系:width = right - left,height = top - bottom。
- View在平移过程中,top和left表示的是原始左上角的位置信息,其值不会改变,发生改变的是x、y、translationX、translationY这四个参数。
- x是View左上角的坐标,translation是view移动后相对于父容器的偏移量,所以有x = left + translationX。y的原理相同。
- getX/getY返回的是相对于当前View左上角的x和y坐标,而getRawX/getRawY返回的是相对于手机屏幕左上角的x和y坐标。
使用Scroller
private void smoothScrollTo(int destX, int destY) {
int scrollX = getScrollX();
int detlaX = destX - scrollX;
int scrollY = getScrollY();
int detlaY = destY - scrollY;
Log.d(TAG, "smoothScrollTo:scrollY, detlaY= " + scrollY+" " + detlaY);
mScroller.startScroll(scrollX, scrollY, detlaX, detlaY, 1000);
invalidate();
}
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate();
}
}
上面是使用Scroller实现弹性滑动的一个典型方法。
实现原理为:Scroller本身无法让View弹性滑动,它需要和View的computeScroll方法配合使用才能共同完成这个功能。在startScroll()方法下调用了invalidate(),这使得View重绘