Android分析scrollBy()和scrollTo()的参数的正负

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操作的是画板移动,而画板为了让开发者不至于混乱而进行反向取值,开发者只要想着自己画的东西该怎么移动就好,不用一会画的东西,一会画板,这两个东西同效果下移动方向是反的,旋转也是这样,画板应该是逆时针转动。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值