Android的滚动(滑动)有很多种实现方式,如动态改变布局参数,属性动画,Scroller等。这些方式大多是通过View的坐标改变来实现的。
布局参数相关实现方式
这一部分主要包括layout()方法以及设置LayoutParams两种方式。
layout()方法实际就是直接控制View坐标的四个点来实现的,上一篇文章(闲聊自定义控件之滑动冲突)中就是使用的这种方式。具体如下:
case MotionEvent.ACTION_MOVE:
xMove = x;
yMove = y;
onceMoveX = xMove - xDown;
onceMoveY = yMove - yDown;
layout(getLeft() + onceMoveX, getTop() + onceMoveY, getRight() + onceMoveX, getBottom() + onceMoveY);
break;
设置LayoutParams这种方式跟layout()方法类似,只是可以单独控制任何一个参数,如果只要左右移动的话,只需要修改其leftMargin 参数即可。具体如下:
LinearLayout.LayoutParams layoutParams =(LinearLayout.LayoutParams)getLayoutParams();
layoutParams.leftMargin = getLeft() + onceMoveX;
setLayoutParams(layoutParams);
offsetLeftAndRight()和offsetTopAndBottom()方式
这两种方式其实跟上面两种使用起来没有太大区别,只需要将layout()方法或者设置LayoutParams参数的代码替换为一下即可。具体如下:
case MotionEvent.ACTION_MOVE:
xMove = x;
yMove = y;
onceMoveX = xMove - xDown;
onceMoveY = yMove - yDown;
offsetLeftAndRight(onceMoveX);
offsetTopAndBottom(onceMoveY);
break;
scrollTo相关——scrollBy、scrollTo、Scroller
scrollBy、scrollTo和Scroller虽然是官方提供给我们的三个不同的API用于View的滑动,但scrollBy和Scroller内部也是通过scrollTo实现的。
使用scrollBy实现滑动过程如下:
case MotionEvent.ACTION_MOVE:
xMove = x;
yMove = y;
onceMoveX = xMove - xDown;
onceMoveY = yMove - yDown;
((View) getParent()).scrollBy(-onceMoveX,-onceMoveY);
break;
scrollBy方法的内部实现如下:
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
通过上段代码就可以明显看出scrollBy和scrollTo的明显关系了,当我们已知需要滚动的距离时可以通过scrollBy来实现,已知滚动的目的地时用scr