~转载请注明:http://blog.youkuaiyun.com/u013015161/article/details/46640273
介绍
最近写了一个Library, 用于实现在Android设备上对大图的浏览。已经实现的功能有:
1、移动、缩放图片
2、双击快速放大或缩小图片
3、单击退出浏览
4、左右滑动切换图片。
目前还只实现了展示SD卡里图片的功能,后续应该补完,使其可以展示网络图片等。
代码已经在Github上开源, 地址为:
https://github.com/lankton/lanimagebrowser
展示:
图片切换
图片缩放
实现
实现的思路很简单。图片的缩放、移动等操作通过自定义ImageView实现,这些自定义ImageView通过Fragment来展现。同时,这些Fragment被绑定到ViewPager上,从而实现对图片的切换。下面简单讲一下几个比较关键的地方。
1. 自定义ImageView
主要重写了OnTouchEvent,来监听各种手势事件。同时重写了OnMeasure和OnLayout,来初始化图片在ImageView的显示。直接上代码吧。
package com.lankton.imagebrowser;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
public class BrowserImageView extends ImageView {
Context context;
float originDistance;
float curDistance;
float scale; //在上次基础上缩放
float curScale = 1;
float beginZoomScale; //开始缩放时的scale
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
PointF curPoint = new PointF();
PointF lastPoint = new PointF();
public BitmapSize bitmapSize;
private Timer closeTimer;
private boolean isClose;
private final float BOUNDS = 30;
private float originX;
private float originY;
float smallScale;
float bigScale;
boolean isToBig = true;
public BrowserImageView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
// bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sb);
// TODO Auto-generated constructor stub
}
public BrowserImageView(Context c)
{
super(c);
this.context = c;
}
public void setBitmapSize(BitmapSize b)
{
this.bitmapSize = b;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
switch(event.getAction() & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
curPoint.x = event.getX();
curPoint.y = event.getY();
savedMatrix.set(matrix);
isClose = true;
originX = curPoint.x;
originY = curPoint.y;
break;
case MotionEvent.ACTION_POINTER_DOWN:
isClose = false;
originDistance = getDistance(event.getX(0), event.getY(0),
event.getX(1), event.getY(1));
beginZoomScale = curScale;
break;
case MotionEvent.ACTION_MOVE:
if(isOutBounds(originX, originY, event.getX(0), event.getY(0)))
{
isClose = false;
}
if(event.getPointerCount() == 2)
{
curDistance = getDistance(event.getX(0), event.getY(0),
event.getX(1), event.getY(1));
scale = curDistance / originDistance;
curScale = beginZoomScale * scale;
matrix.set(savedMatrix);
matrix.postScale(scale, scale
, (event.getX(0) + event.getX(1))/2
, (event.getY(0) + event.getY(1))/2);
this.setImageMatrix(matrix);
}
else if(event.getPointerCount() == 1)
{
lastPoint.x = curPoint.x;