Android的Scroller用法
2015-11-13 15:14
351 查看
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拖动到位置,在回到起始点。
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; } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories