1、Android的Scroller类是一个为View实现平滑的(Help)帮助类。
Scroller类提供了一个computeScrollerOffset()方法来判断是否完成了整个滑动,同时也提供了getCurrx()、getCurrY()方法来获的当前的滑动坐标,在上面的代码中,唯一
需要注意的是invalidate()方法,因为只能在computeScroll()方法中获取模拟过程中的ScrollX和ScrollY坐标。但computeScroll()方法是不会自动调用的,只能通过invalidate()
→draw()→computeScrooll()来间接调用computeScroll()方法,所以需要在模板代码中调用invalidate()方法,实现循环获取scrollX和scrollY的目的。而当模拟过程结束后,scroller.computeScrollOffset()方法会返回false,从而中断循环,完成怎个平滑的过程。
实现平滑移动要重写两个方法:
public void startScroll(int startX, int startY,int dx, int dy, int duration);
public void startScroll(int startX, int startY, int dx , int dy);
这是实现一个自定义View拖动到位置,在回到起始点。
public class ScrollerView extends View {
private Scroller scroller;
public ScrollerView(Context context) {
super(context);
initView(context);
}
public ScrollerView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public ScrollerView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
public void initView(Context context) {
setBackgroundColor(Color.GREEN);
scroller = new Scroller(context);
}
@Override
public void computeScroll() {
super.computeScroll();
//判断Scroller是否执行完没。
if (scroller.computeScrollOffset()) {
//记住Scroller的滑动当前坐标。
((View) getParent()).scrollTo(scroller.getCurrX(), scroller.getCurrY());
//不停的绘制
invalidate();
}
}
int lastX;
int lastY;
@Override
public boolean onTouchEvent(MotionEvent event) {
// int x = (int) event.getX();
// int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getX();
lastY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
int offsetX = (int) event.getX() - lastX;
int offsetY = (int) event.getY() - lastY;
((View) getParent()).scrollBy(-offsetX, -offsetY);
break;
case MotionEvent.ACTION_UP:
//手指离开时,执行滑动过程
View viewGroup = (View) getParent();
scroller.startScroll(viewGroup.getScrollX(), viewGroup.getScrollY(), -viewGroup.getScrollX(),-viewGroup.getScrollY(),5000);
invalidate();
break;
}
return true;
}
}