Android分析scrollBy()和scrollTo()的参数的正负
1. 首先看如何在View正中心绘制一个圆圈
一般会如下绘制
canvas.drawCircle(getWidth() / 2f, getHeight() / 2f, 100, mPaint);
也可以
canvas.save();
canvas.translate(getWidth() / 2f, getHeight() / 2f);
canvas.drawCircle(0, 0, mFocusRingRadius, mPaint);
canvas.restore();
这两种方式存在很大的不同,上面的方式是在画板的中央绘制,而下面是在view坐标系左顶点绘制,如果不translate,那么应该在左顶点绘制圆圈,为什么到了中间,是因为移动了画板。这里要看一下画板是如何移动的:
可以很明显看出,画板应该向左上方移动才会让圆圈在view中心展示。而translate的参数都是正数,按我们的习惯,应该是负数才对。也就是第一种方式的那种思路,这里应该是谷歌为了开发者的思路不混乱,让translate的参数和第一种绘制一样(这个在Bitmap创建画板上有充分的体现,移动旋转等操作都得反着来,比如:在一张纸正中心画个点,点向右移动,画就是左移纸(translate值为正),点就应该画在纸张右边,实际上画在了左边,因为translate参数是正的,Bitmap画板不具备这种矫正能力)。
那么再看scroll,将一个可以scroll的view中心画一个,圆圈不管怎么滑动都在中心展示,代码如下:
canvas.save();
canvas.translate(getWidth() / 2f, getHeight() / 2f + getScrollY());
canvas.drawCircle(0, 0, mFocusRingRadius, mPaint);
canvas.restore();
假设scrollY为0,用户向上滑动,如果圆圈如果不+ getScrollY就应该跟着上移,如果圆圈需要保持在正中心,那圆圈就需要向用户的反方向移动,需要向下移动:
从最开始的对比可以知道,translate参数为正时,圆圈向下移动,用户向上滑动,scroll参数值正好是正值,也就是正向变化。
再看用户向下滑动,scroll滑动过程中都是负值+scroll,也就是getScrollY会慢慢变小到0,getScrollY越来越小,圆圈向下移动距离越来越小,圆圈向上移动,也就是圆圈向上移动才能保证圆圈处于正中心。用户向下滑动,如果圆圈位置不发生变化,圆圈应该逐渐向下移动,为了抵消这个移动,圆圈需要向上滑动,也就是画板向下移动,translate参数也是负值变化规律。
从以上推论可以知道,scroll参数变化,用户向上滑动,参数值为正向变化,反过来,用户向下滑动,参数值为反向变化,也就是负值。scroll操作的是画板移动,而画板为了让开发者不至于混乱而进行反向取值,开发者只要想着自己画的东西该怎么移动就好,不用一会画的东西,一会画板,这两个东西同效果下移动方向是反的,旋转也是这样,画板应该是逆时针转动。