首先要把思路弄清楚,先将这个项目运行在手机上,玩一玩,看看他都有哪些功能,然后再考虑那些功能是怎么实现的。
项目Github链接
第一阶段
折腾一番后就大致有个印象了,接下就可以分析具体功能了,且不看布局这些是怎么弄的,先从这个库的入口开始分析,就是我们是怎么与图片进行交互的,手势! 对,我们通过手势来改变图片的显示,可以平移,旋转,放大,我们应该从这里切入,整个思路就会比较清晰。
那么,问题来了。
如何分配这些功能,我应该创建几个类,他们之间应该是怎样的继承关系等等,这就是体现作者功底的时候了,究竟该如何架构,是很值得研究的问题。
1.手势的处理
我们需要一个类,这个类可以识别用户的手势,然后调用相应的方法。这里肯定涉及到多点触控
问题1:如何判断用户的最后一根手指已经释放?
假如我们现在已经拿到了用户的手势,那么肯定需要接着调用某个类的某种方法来进行处理,比如,我们已经识别出是一个平移的手势,势必有一个postTranslate(disX,disY)方法来对应。
那具体平移的操作又该放在哪个类中呢,还有缩放,旋转,裁剪等等方法。
问题2:如何确定类的功能,如何去耦合
我是想不到一个完美的方案来解决这个问题,或者说,我必须要在做的过程中慢慢的优化架构,而暂时不具备在开始项目的时候就直接描绘出轮廓,毕竟是菜鸟。
分层的思想
作者在这里分出了三个类,各有不同的功能
GestureCropImageView
专门识别用户的手势,平移,缩放,旋转。他并不关心怎样去做具体的操作,也不关心裁剪。
TransformImageView
基本功能包括加载图片,对图片进行平移,缩放,旋转,并且通知监听者正在进行哪些操作。
CropImageView
核心类。具体的手势识别,具体的平移操作,这些都只是一个功能点,这个类的作用更像是一个管理者,负责将这些功能点组合起来,达到好的用户体验和库真正功能的实现。
第二阶段
第一阶段只是一个大致的印象,有了一个宏观脉络,可以到现在,我们还一行代码都没看呢?
折腾这个库的时候,我很好奇他进去的时候是如何摆放图片和裁剪提示框的,如何做到正好能让他们吻合。
问题3:怎样初始化我们的裁剪控件,达到和裁剪提示框吻合的效果
作者使用了一个uCropView作为外层嵌套布局,里面包含我们的裁剪提示框OverlayView和裁剪控件GestureCropImageView.
因为作者将这个库设计得很灵活,用户可以选择指定的裁剪比例,有16:9,4:3等,还可以使用原生图片的宽高比,并且在控件中可以动态调整裁剪比例,这就必然需要两个控件之间进行交互,最好的办法就是设置一个监听器。
mGestureCropImageView.setCropBoundsChangeListener(new CropImageView.CropBoundsChangeL