您的位置:首页 > 移动开发 > Android开发

Android学习笔记-使用Scroller来滚动视图

2016-01-17 17:59 447 查看
Scroller滚动视图可以实现平滑移动的效果,而不是瞬间完成的移动,接下里我们实现一个view可随手指移动而移动,当放开手指的时候回到原位置,使用Scroller需要三步,接下来一一介绍

scrollBy与scrollTo都是移动的是ViewGroup的内容,当在view中调用时移动的是View的内容,如TextView移动的为文字

1.初始化Scroller

通过他的构造函数来初始化

Scroller mScroller = new Scroller(mContext);


2.重写computeScroll方法,显示平滑的移动

看一下如何来重写

@Override
public void computeScroll() {
super.computeScroll();
if(mScroll.computeScrollOffset()){
((View)getParent()).scrollTo(mScroll.getCurrX(),mScroll.getCurrY());
//通过重绘来不断调用computeScroll方法
invalidate();
}
}


Api的说明Called by a parent to request that a child update its values for mScrollX and mScrollY if necessary. This will typically be done if the child is animating a scroll using a {@link android.widget.Scroller Scroller}object.

当view的父容器想要更新mScrollX,mScrollY时被调用,而mScrollX为当内容被滚到后的x州的偏移距离

3.startScroll 开启滚动

当放开手指时,

@Override
public boolean onTouchEvent(MotionEvent event) {
Log.d("xinwa","--onTouchEvent--");
int x = (int) event.getX();
int y = (int) event.getY();

switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
lastX = x;
lastY = y;
break;
case MotionEvent.ACTION_MOVE:
int offsetX = lastX - x;
int offsetY = lastY - y;
((View)getParent()).scrollBy(offsetX, offsetY);
invalidate();
break;
case MotionEvent.ACTION_UP:
ViewGroup viewGroup = (ViewGroup) getParent();
mScroll.startScroll(viewGroup.getScrollX(),
viewGroup.getScrollY(),
-viewGroup.getScrollX(),
-viewGroup.getScrollY());
invalidate();
break;
}
return true;
}


说一下调用的过程

1.首先当我们手指离开的时候,调用了mScroller.startScroll()设置了要进行滚动的偏移量,然后调用invalidate()方法去重绘,在onDraw()方法中又会去调用computScroll()方法

2.mScroll.computeScrollOffset()该方法计算mScroll的偏移量,当滑动没有完成的时候返回true,然后通过((View)getParent()).scrollTo(mScroll.getCurrX(),mScroll.getCurrY());来对view进行滑动,真正起作用的还是scrollTo方法,Scroller类只是提供在一段时间内,他的值会改变,在继续调用invaidate方法来反复时ViewGroup中的内容进行移动
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: