Android Scroller、scrollBy和scrollTo

先说坐标系

  • 视图坐标
    Android view的视图是没有边界的,也就是说canvas是没有边界的,可以无限绘制, 那么这种无边界的坐标被成为视图坐标。(绝对坐标,坐标原点为屏幕左上角)
  • 布局坐标
    也交相对坐标,在View Layout时以当前view的左上角为坐标原点
    这里盗一张图
    Android Scroller、scrollBy和scrollTo_第1张图片

scrollBy和scrollTo

至于两者的区别,网上很多详细说明,就是scrollBy是滚动的一段距离(disx, disy), scrollTo是滚动到指定坐标(direcx, direcy)。这里说一些注意事项

  • scrollBy实际是调用的scrollTo 方法,所以两者的实现是一样的。
  • view的getScrollY()方法获取的是scrollTo中设置的direcY也就是滚动的偏移量, 其绝对值是view实际滚动的距离,但是getScrollY()的值的符号与坐标系符号相反, 比如当前从(0, 0)位置滚动到(100, 100)位置,偏移量是(0-100, 0-100)=(-100, -100)所以应该设置scrollTo(-100, -100)达到效果。 因此这个偏移量的符号与实际便宜终点位置减起始位置的符号相反。
  • 根据上一条,在处理TouchEvent时,传入scrollTo的参数应该是终点位置减去起始位置的相反数,同理,获取当前scrollOffset时也是getScrollY的相反数
  • scrollTo改变的是view中content的位置,而不会改变view的位置,view的位置是通过layout改变的,因此scrollTo不会影响getLeft等值。

再说scroller

scroller本身并不能让view滚动,其滚动的本质还是调用view的scrollBy或者scrollTo方法,因此scroller的作用只是将滚动距离按照设定的时间间隔拆分一小段一小段,使得view滚动更加平滑。

Scroller涉及的方法

  • view的方法
    invalidate() 刷新界面,
    computeScroll() view滑动时会被父view调用该方法
  • scroller的方法
    • computeScrollerOffset() 该方法计算scroller在处理view滚动时的一些坐标信息。如果滚动结束该方法返回false, 否则返回true
    • startScroll(int startX, int startY, int dx, int dy) 该方法设置scroll的参数设置了view开始滚动的一些初始坐标信息startX, startY和滚动距离dx(水平方向,正数**content**向左滚, 负数向右) , dy(竖直方向, 正数 content向上,负数向下), 其实这里的滚动方向都是由最后回调的scrollBy方法决定的,而这里的向上向下与上面的说的scrollBy参数的符号与正常坐标计算的符号相反是一个道理。
  • fling(int startX, int startY, int velocityX, int velocityY,
    int minX, int maxX, int minY, int maxY)处理快速滑动的。startX, startY是指定一个初始的坐标值,这个值可以随意传,但是在使用时要符合当时场景,前后一致。velocityX 横向滑动速度,velocityY纵向滑动速度,单位 像素/s。后面的min和max参数是滑动的最大x,y的坐标

Scroller 的处理流程

  1. startScroll或者fling方法,设置滑动的一些初始和滑动信息。
  2. 关键是调用invalidate()方法触发view重绘关键是调用invalidate()方法触发view重绘
  3. view绘制之前会调用view的computeScroll()方法,所以在该方法中调用scrollBy方法做实际的滚动操作。
    example:
	@Override 
	public void computeScroll() { 
	    super.computeScroll(); 
	     if (mScroller.computeScrollOffset()) { 
	         scrollTo(mScroller.getCurrX(), 0); 
	         invalidate(); 
	     } 
	} 

注意在调用完scroll方法后要调用invalidate继续后续刷新

你可能感兴趣的:(Android)