PhotoView 源码解析
本文为 Android 开源项目源码解析 中 PhotoView 部分
项目地址:PhotoView,分析的版本:48427bf,Demo 地址:PhotoView-demo
分析者:dkmeteor,校对者:cpacm,校对状态:完成
1. 功能介绍
特性(Features):
- 支持Pinch手势自由缩放。
- 支持双击放大/还原。
- 支持平滑滚动。
- 在滑动父控件下能够运行良好。(例如:ViewPager)
- 支持基于Matrix变化(放大/缩小/移动)的事件监听。
优势:
- PhotoView是ImageView的子类,自然的支持所有ImageView的源生行为。
- 任意项目可以非常方便的从ImageView升级到PhotoView,不用做任何额外的修改。
- 可以非常方便的与ImageLoader/Picasso之类的异步网络图片读取库集成使用。
- 事件分发做了很好的处理,可以方便的与ViewPager等同样支持滑动手势的控件集成。
2. 总体设计
PhotoView这个库实际上比较简单,关键点其实就是Touch事件处理和Matrix图形变换的应用.
2.1 TouchEvent及手势事件处理
对TouchEvent分发流程不了解的建议先阅读 Android Touch事件传递机制
本库中对Touch事件的处理流程请参考第三部分的流程图,会有一个比较直观的认识。
2.2 Matrix
由于Matrix是Android系统源生API,很多开发者对此都比较熟悉,为了不影响阅读效果,故不在此详细叙述,如果对其不是很了解,可以查看本文档末尾的Matrix补充说明
3. 流程图
Touch及手势事件判定及传递流程:
如图,从架构上看,干净利落的将事件层层分离,交由不同的Detector处理,最后再将处理结果回调给PhtotViewAttacher中的Matrix去实现图形变换效果。
4. 详细设计
4.1 核心类功能介绍
Core核心类
4.1.1 PhotoView
PhotoView 类负责暴露所有供外部调用的API,其本身直接继承自ImageView,同时实现了IPhotoView接口.IPhotoView接口提供了缩放相关的设置属性 和操控matrix变化的回调接口.
主要方法说明:
- public PhotoView(Context context)
- public PhotoView(Context context, AttributeSet attr)
- public PhotoView(Context context, AttributeSet attr, int defStyle)
构造函数,完全与ImageView相同,你可以将PhotoView直接当做ImageView使用,完全兼容.
- public void setPhotoViewRotati