我的Android笔记--简单的图片查看器实现思路

来源:互联网 发布:c 程序员发展方向 编辑:程序博客网 时间:2024/06/15 16:20

思路

很多应用都用到了图片查看器,在网上也可以找到很多成熟的图片查看器类。这里记录一下我对于简单图片查看器的实现方法,自定义一个继承ImageView的类,下面称为GIV,主要在代码中处理以下三点。
1、图片的初始位置。
2、捕捉用户手势
3、手势判别和处理

初始位置

首先,我们需要处理ImageView中图片的初始位置。还有,GIV的ScaleType必须是Matrix。
通常来说GIV直接布置在一个页面的FrameLayout或者RelativeLayout中,由于使用了Matrix的缩放模式,图像的边界起点位于屏幕左上角,我们在图像初始加载以后,需要对GIV中的图像使用矩阵进行处理,将图像的内容缩放和移动到屏幕的相对中心位置。
完成这步操作,有三个要点。
获取一个空的Matrix实例mMatrix,对其进行以下操作
1、移动图像到屏幕中间,使用Matrix.postTransalte(x,y)方法设置mMatrix。
2、获取GIV中图像的绝对宽度和高度,可以使用getDrawable().getIntrinsicWidth()和getDrawable().getIntrinsicgHeight()来获取。对比屏幕宽高以后,设置缩放比。使用Matrix.postScale(scalX,scalY,pointX,pointY)方法来对GIV图像内容进行缩放,scalX和scalY代表X和Y方向的缩放比例,pointX和pointY代表缩放中心点。
3、调用setImageMatirx(mMatrix)便可将图像移动到屏幕中间

手势捕捉

重写ImageView的onTouchEvent(MotionEvent)方法,返回值设为true。方法主要处理手势的down,up,move和point_up事件,这个图片查看器只支持双点缩放,和单点拖拽,对于图像的拖拽、缩放位置的限制,在GIV类中还做了进一步处理。
另,当GIV使用在ViewPager中时,我参考网友的分享,直接自定义一个ViewPager解决这个问题,代码中可以看到。

手势处理

主要需要和GIV中图像的矩形范围做对比,然后再来判断是否需要移动或者缩放图像内容。GIV图像矩形范围可以根据GIV当前的矩阵mMatrix,通过以下方法来获取。
/**
* 返回Drawable的矩形
*
* @return imageView矩形数据
*/
private RectF getImageRectF() {
RectF rect = new RectF();
Drawable d = getDrawable();
if (d != null) {
rect.set(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
mMatrix.mapRect(rect);
}
return rect;
}

下面是我的自定义的图片查看器
自定义的图片查看器

源码和参考

在我源码里面有较为详细的注释
我的源码链接
参考文章1
参考文章2

2 0
原创粉丝点击