之前做項目要對圖檔的檢視,然後就自己寫了一個,适合對圖檔的浏覽,跟系統圖庫的效果一樣哦,先貼一張美女圖檔,聽說有美女,男人就會多看一眼,不知道是不是真的,哈哈

布局檔案需要注意的一點是 scaletype一定要是 matrix,這樣才能對圖檔進行一系列的矩陣操作,例如放大縮小,拖拽,等等
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<imageview
android:id="@+id/imageview1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaletype="matrix" />
</relativelayout>
代碼我都有注釋,直接上代碼咯
package com.example.zoomanddrafting;
import android.app.activity;
import android.content.context;
import android.content.intent;
import android.graphics.bitmap;
import android.graphics.bitmapfactory;
import android.graphics.matrix;
import android.graphics.pointf;
import android.graphics.rectf;
import android.os.bundle;
import android.util.displaymetrics;
import android.util.floatmath;
import android.view.motionevent;
import android.view.view;
import android.view.view.ontouchlistener;
import android.widget.imageview;
public class photoviewer extends activity implements ontouchlistener {
private static final string tag = "photoviewer";
public static final int result_code_nofound = 200;
matrix matrix = new matrix();
matrix savedmatrix = new matrix();
displaymetrics dm;
imageview imgview;
bitmap bitmap;
/** 最小縮放比例*/
float minscaler = 1.0f;
/** 最大縮放比例*/
static final float max_scale = 10f;
/** 初始狀态*/
static final int none = 0;
/** 拖動*/
static final int drag = 1;
/** 縮放*/
static final int zoom = 2;
/** 目前模式*/
int mode = none;
pointf prev = new pointf();
pointf mid = new pointf();
float dist = 1f;
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
// 擷取圖檔資源
bitmap = bitmapfactory.decoderesource(getresources(), r.drawable.item);
setcontentview(r.layout.activity_main);
imgview = (imageview) findviewbyid(r.id.imageview1);// 擷取控件
imgview.setimagebitmap(bitmap);// 填充控件
imgview.setontouchlistener(this);// 設定觸屏監聽
dm = new displaymetrics();
getwindowmanager().getdefaultdisplay().getmetrics(dm);// 擷取分辨率
// minzoom();
center();
imgview.setimagematrix(matrix);
}
public void sureonclick(view v)
{
/**
* 觸屏監聽
*/
public boolean ontouch(view v, motionevent event) {
switch (event.getaction() & motionevent.action_mask) {
// 主點按下
case motionevent.action_down:
savedmatrix.set(matrix);
prev.set(event.getx(), event.gety());
mode = drag;
break;
// 副點按下
case motionevent.action_pointer_down:
dist = spacing(event);
// 如果連續兩點距離大于10,則判定為多點模式
if (spacing(event) > 10f) {
savedmatrix.set(matrix);
midpoint(mid, event);
mode = zoom;
}
case motionevent.action_up:
case motionevent.action_pointer_up:
mode = none;
//savedmatrix.set(matrix);
case motionevent.action_move:
if (mode == drag) {
matrix.set(savedmatrix);
matrix.posttranslate(event.getx() - prev.x, event.gety()
- prev.y);
} else if (mode == zoom) {
float newdist = spacing(event);
if (newdist > 10f) {
matrix.set(savedmatrix);
float tscale = newdist / dist;
matrix.postscale(tscale, tscale, mid.x, mid.y);
}
}
checkview();
return true;
* 限制最大最小縮放比例,自動居中
private void checkview() {
float p[] = new float[9];
matrix.getvalues(p);
if (mode == zoom) {
if (p[0] < minscaler) {
//log.d("", "目前縮放級别:"+p[0]+",最小縮放級别:"+minscaler);
matrix.setscale(minscaler, minscaler);
if (p[0] > max_scale) {
//log.d("", "目前縮放級别:"+p[0]+",最大縮放級别:"+max_scale);
* 最小縮放比例,最大為100%
private void minzoom() {
minscaler = math.min(
(float) dm.widthpixels / (float) bitmap.getwidth(),
(float) dm.heightpixels / (float) bitmap.getheight());
if (minscaler < 1.0) {
matrix.postscale(minscaler, minscaler);
private void center() {
center(true, true);
* 橫向、縱向居中
protected void center(boolean horizontal, boolean vertical) {
matrix m = new matrix();
m.set(matrix);
rectf rect = new rectf(0, 0, bitmap.getwidth(), bitmap.getheight());
m.maprect(rect);
float height = rect.height();
float width = rect.width();
float deltax = 0, deltay = 0;
if (vertical) {
// 圖檔小于螢幕大小,則居中顯示。大于螢幕,上方留白則往上移,下方留白則往下移
int screenheight = dm.heightpixels;
if (height < screenheight) {
deltay = (screenheight - height) / 2 - rect.top;
} else if (rect.top > 0) {
deltay = -rect.top;
} else if (rect.bottom < screenheight) {
deltay = imgview.getheight() - rect.bottom;
if (horizontal) {
int screenwidth = dm.widthpixels;
if (width < screenwidth) {
deltax = (screenwidth - width) / 2 - rect.left;
} else if (rect.left > 0) {
deltax = -rect.left;
} else if (rect.right < screenwidth) {
deltax = screenwidth - rect.right;
matrix.posttranslate(deltax, deltay);
* 兩點的距離
private float spacing(motionevent event) {
float x = event.getx(0) - event.getx(1);
float y = event.gety(0) - event.gety(1);
return floatmath.sqrt(x * x + y * y);
* 兩點的中點
private void midpoint(pointf point, motionevent event) {
float x = event.getx(0) + event.getx(1);
float y = event.gety(0) + event.gety(1);
point.set(x / 2, y / 2);
}