scrollTo scrollBy scrollX scrollY  offsetDescendantRectToMyCoords的理解

参考:http://blog.csdn.net/qinjuning/article/details/7247126

scrollTo与scrollBy:

scrollTo:

scrollBy:


view.scrollBy(100,0)是将view所onDraw的内容向左移动100个像素。对于view的onDraw来说,canvas可以理解为无边界的,无穷大。对于下图中C的onDraw来说,它的可视区域是位于B中可视的区域,它调用scrollBy移动后D跟着移动,移进可视区域的画布也还是蓝色的。

例:scrolltotest:
如图,A包含B,B包含C,C包含D,各layout的mLeft,mTop都是20像素,D的边长是60.

初始时D位于C的坐标值[20,20,80,80].
点击button,调用:layC.scrollBy(-50, 0);
调用后,D向右移动50像素,D位于C中的坐标[20,20,80,80]没变。但是layC.getScrollX()从0变为-50
再调用:

打印结果:viewDRect in layA:[110,60][170,120]

layA.offsetDecendantRectToMyCoords(layC, viewDRect)是将D在C中的坐标值viewDRect变为A坐标系中的坐标值。

Scroller对象

ViewGroup.dispatchDraw中:for循环调用drawChild(child),在drawChild中child.draw(),也就是View.draw(),其中调用computeScroll:

它是个空函数。

FocusScrollRelativeLayout中,使用辅助类Scroller结合computScroll函数,不断的调用View.scrollTo或View.scrollBy来实现内容滚动。(假设view的画布是无限大的,想滚动多少距离就能滚动多少距离。而H5中,里面要嵌套一层div来模拟android的那层画布,而且要指定好大小)。

先说FocusScrollRelativeLayout:
onKeyDown中计算好要滚动的距离dx,dy,然后调用:

界面开始一直刷新,然后不断调用computeScroll:

由于mScroller中设置好了duration时间,在这段时间内,mScroller.computeScrollOffset()都是一直返回true的,从而调用了scrollTo方法实现view的内容移动。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值