前言
- 如上图,在跟《启舰_自定义控件》学习到第10章时,遇到一个功能出现问题;出现这个问题我很懵圈,花了 6 个小时调BUG,总结出血泪教训:脑子是个好东西啊!
- 书中代码把放大倍率,以及放大镜半径写死了;我觉得不必如此,非要加上 SeeBbar,随后多花了6个小时……
原因
- 还是先看源码,源码在我的博客:小动画之图片🔍(ShapeDrawable);
- 出现BUG的表现在于:手指按下之后,放大的位置不是手指按压的位置;进行了如下分析:
- 手指按下,应该是 onTouchEvent 事件中处理过程中,mMatrix.setTranslate 函数导致的,我一度怀疑,书中给的代码不正确,经过在网上调研其他方法,好吧……这是对的;
mMatrix.setTranslate(radius - factor * x, radius - factor * y);
- 是不是 SeeBbar 参数传递的问题?我甚至怀疑自己对 static 和 final 的理解;因为这是从 activity 向自定义 View 传递数据,一开始使用静态成员的方法,后来通过 在自定义 VIew 中定义 set 方法,在 activity 中实例化 View 调用其 set 方法;进行传递;
- 我后来在想,这个方法是不是,必须让放大半径和放大倍率设置为静态常量?否则就会计算错误?我的脑子真是会给自己加戏;
- 最后知道真相的我眼泪掉下来……
- 手指按下,应该是 onTouchEvent 事件中处理过程中,mMatrix.setTranslate 函数导致的,我一度怀疑,书中给的代码不正确,经过在网上调研其他方法,好吧……这是对的;
方法
- 其实都不是,触摸事件中,mMatrix 的平移是对的;
- SeeBbar 的参数传递也不是根本原因;
- 并不是必须设置为静态常量;
- 而是自定义 View 的 onDraw 方法中,对放大镜 BitmapShader 的初始化只进行了一次,要注意;这个初始化的放大镜其实就是一个可以放大的一个 BitmapShader,而放大的参数是个放大镜的放大倍率有直接关系,也就是说!每次通过 SeeBbar 更新放大倍率后都要重更新创建 BitmapShader;
感慨
- 自己根本就没有明白动画的含义,每一句,每一个变量代表什么意思!虽然有收获,但我觉得得不偿失,最根本的原因是学习不仔细!
- 一味的求结果,出现问题,不是找原因,而是找那里抄错了,不是看逻辑原理而是看结果现象;实在是个笨人!
- 出现问题一定要究其原因,不能只顾结果和现象!不然只会治标不治本!要动脑!