关于scroller 他是Androidview 移动的一个辅助类
首先来说一说View 的移动,
View 有两个移动的方法:
View.scrollBy(x, y)
View.scrollTo(x, y)
需要注意的 这两个方法 移动的不是View 本身, View 里面的内容,
不能单纯的理解是移动子View
例如TextView 调用 scrollBy scrollTo 方法移动的是 TextView 的文字内容
ok 再来说说 这两个方法的具体 用途以及区别
scrollBy(x, y) 方法是相对当前的位置 再移动 x像素, y像素
scrollTo(x, y) 方法是相对初始没有移动的位置, 移动的距离, 可以理解为移动到
x 为正 表示向左移动
y 为正 表示向上移动
如果想移动的 View 本身可以使用
ViewGroup.setTranslationX(x)
ViewGroup.setTranslationY(x)
这里
x 为正表示向右移动
y 为正表示向下启动
ok 接下来说说 Scroller 这个辅助类
可以先看下下面的代码 很简单
public class MyViewGroup extends RelativeLayout {
public static final String TAG = "MyViewGroup";
boolean flag = true;
private Scroller mScroller;
public MyViewGroup(Context context) {
super(context);
init();
}
public MyViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mScroller = new Scroller(getContext());
}
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
LogUtil.d(TAG, "mScroller.getCurrX() = " + mScroller.getCurrX());
scrollTo(mScroller.getCurrX(), 0);
postInvalidate();
}
}
public void bingScroll() {
LogUtil.d(TAG, "bingScroll falg = " + flag);
if (flag) {
mScroller.startScroll(0, 0, 500, 0, 1000);
} else {
mScroller.startScroll(500, 0, -500, 0, 1000);
}
flag = !flag;
invalidate();
}
}
当调用 bingScroll 的时候 回去调用 startScroll 方法, 然后在刷新View
在刷新View 的时候 View 会调用 computeScroll 方法, 在这个方法里面,
可以用 mScroller.computeScrollOffset() 来判断, 我们 用 startScroll 是还在移动时间内,是否还需要移动,
如果 mScroller.computeScrollOffset() 返回true 那么就说明需要移动了,
可以使用 mScroller.getCurrX() 或 mScroller.getCurrY() 获取当前移动的值
然后把这个值设置给当前View 就好
上面就是一个非常简单的 使用 scroller 的例子
我们大多用在 :
当我们想让View 跟手指滑动的时候,
可以在滑动过程中 获取手指移动距离,使用 View 本身的scrollTo方法 ,来实现移动
但是 当我们 抬起手指是,向让View 惯性移动, 就不好再用 View 本身的scrollTo方法了
那么这时 就可以使用 Scroller.startScroll(x,y, dx,dy, duration) 方法了这样View 就可以在我们抬起手指后也依然滑动了
在来详细讲一下 Scroller.startScroll(x,y, dx,dy, duration) 方法
x, y 表示滑动的其实位置, 这个位置是相对于最初始 没有滑动时 的一个位置
dx, dy 表示滑动距离, 同样
dx 为正 表示向左移动
dy 为正 表示向上移动
duration 表示滑动所需要的时间
mScroller.startScroll(0, 0, 500, 0, 1000);
mScroller.startScroll(500, 0, -500, 0, 1000);
从上面的代码可以看到
一开始 view 在 x轴上 向左移动了500像素
然后移动回 最开始的位置
对了 View 还有两个方法 获取当前View 滑动的距离
getScrollX()
getScrollY()
上面的 mScroller.startScroll(500, 0, -500, 0, 1000); 方法可以改为:
mScroller.startScroll(getScrollX(), 0, -getScrollX(), 0, 1000);
ok scroll 的基本相关内容基本ok 了具体到一下 跟手滑动的相关内容, 后面会再次讲到