(首先声明这是来自github的内容,本人只是搬运工。他在github中提供了工程,介绍了一个复用的控件:PhotoView,然后给了2个应用实例)
这个工程具有以下功能
- 通过多点触摸或者双击实现图片缩放
- 实现平滑快速滑动(fling)的卷动
- 可以完美运行在可滑动的父控件(比如ViewPager)上
- 当显示的矩阵发生改变时,应用程序可以得到通知。这点对需要通过当前的放缩/滑动的位置来更新UI非常有用。
- 当点击触摸图片时,应用程序可以得到通知。
附件文件中有2个工程,一个是这边文章介绍的主题:phoview,这个工程是library形式存在的,如下图。
另一个是对PhotoView的实例应用:对单张图片的缩放,对多个图片的应用(应用性很强)。下面就介绍下工程的结构。
Library工程:
工程有7个java文件组成,之所以有这么多文件是因为工程考虑Android的效率,根据SDK版本的不同使用不同的实现,当使用高版本的SDK时,会使用高版本的API,这样的好处是高版本的API要比低版本的同样的API执行效率要高。
首先我们先看Compat.java和SDK16.java两个文件,这两个是相关的文件。
public class Compat {
private static final int SIXTY_FPS_INTERVAL = 1000 / 60;
public static void postOnAnimation(View view, Runnable runnable) {
if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) {
SDK16.postOnAnimation(view, runnable);
} else {
view.postDelayed(runnable, SIXTY_FPS_INTERVAL);
}
}
}
@TargetApi(16)
public class SDK16 {
public static void postOnAnimation(View view, Runnable r) {
view.postOnAnimation(r);
}
}
观察不难发现这2个类的就是对view对象添加一个 runable消息队列中,不同之处在于在sdk>16,即版本高于4.1的使用的时View.postOnAnimation方法,低于16时使用View.postDelayed()。
我们可以将ScrollerProxy.java和VesionedGestureDetector.java规成一类,他们的作用就是针对sdk不同的版本对相同的接口实现不同实例化。SrollerProxy.java的两个实现话的分割点是sdk = 9(2.3版本),在早于2.3使用的时Scroller类,2.3之后使用OverScroller类,通过观察API我们发现OverScroller类的对用就是替代的Scroller类。VersionedGestureDetector.java同样类似,大家可以通过下载源码观察。
IPhoneView.java是一个接口类。
(工程下载URL)