首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

自动适配荧幕支持缩放旋转,自动居中的imageview

2013-04-20 
自动适配屏幕支持缩放旋转,自动居中的imageview废话不多说,直接代码。该imageview 只能代码里new出来使用。

自动适配屏幕支持缩放旋转,自动居中的imageview

废话不多说,直接代码。该imageview 只能代码里new出来使用。不能xml布局配置。有空再修改成可以配置使用的。

?

?

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Matrix;

import android.graphics.PointF;

import android.util.FloatMath;

import android.view.MotionEvent;

import android.widget.ImageView;

?

public class TouchImageView extends ImageView {

?

float x_down = 0;?

? ? float y_down = 0;?

? ? PointF start = new PointF();?

? ? PointF mid = new PointF();?

? ? float oldDist = 1f;?

? ? float oldRotation = 0;?

? ? Matrix matrix = new Matrix();?

? ? Matrix matrix1 = new Matrix();?

? ? Matrix savedMatrix = new Matrix();?

?

? ? private static final int NONE = 0;?

? ? private static final int DRAG = 1;?

? ? private static final int ZOOM = 2;?

? ? int mode = NONE;?

?

? ? boolean matrixCheck = false;?

?

? ? int widthScreen;?

? ? int heightScreen;?

? ??

? ? //变换类型

? ? private static final int TYPE_WIDTH = 1;//只变宽度

? ? private static final int TYPE_HIGHT = 2;//只变高度

? ? private static final int TYPE_ALL = 3;//宽高都变

? ? private static final int TYPE_NONE = 4;//无变换

?

? ? Bitmap gintama;?

? ??

? ? public TouchImageView(Context ctx, Bitmap bmp, int screenWPix, int screenHPix) {?

? ? ? ? super(ctx);

? ? ? ? gintama = bmp;

? ? ? ? widthScreen = screenWPix;

? ? ? ? heightScreen = screenHPix;

? ? ? ? matrix = new Matrix();?

? ? ? ? initBitmap();

? ? }?

?

? ? @Override

public void setImageBitmap(Bitmap bm) {

// TODO Auto-generated method stub

? ? gintama = bm;

? ? initBitmap();

}

? ??

@Override

public void setImageResource(int resId) {

// TODO Auto-generated method stub

gintama = BitmapFactory.decodeResource(getResources(), resId);

initBitmap();

}

?

protected void onDraw(Canvas canvas) {?

if(gintama == null) return;

? ? ? ? canvas.save();?

? ? ? ? canvas.drawBitmap(gintama, matrix, null);?

? ? ? ? canvas.restore();?

? ? }?

?

private void initBitmap()

{

? ? if(gintama == null) return;

float srcWidth = gintama.getWidth();

float srcHight = gintama.getHeight();

matrix.reset();

//偏移屏幕宽度的10%像素

float offset = widthScreen * 0.1f;

float width = widthScreen - offset;

float hight = heightScreen - offset;

?

//初始化移动距离

float dx = (widthScreen - srcWidth)/2f;

float dy = (heightScreen - srcHight)/2f;

?

int type = TYPE_NONE;

float scale = 1f;

if(srcWidth > width)

{

scale = width / srcWidth;

type = TYPE_WIDTH;

if(srcHight > hight)

{

float temp = hight / srcHight;

type = TYPE_ALL;

if(scale > temp)

{

scale = temp;

}

}

}else{

if(srcHight > hight)

{

scale = heightScreen / srcHight;

type = TYPE_HIGHT;

}

}

?

if(scale != 1f){

//缩放

matrix.postScale(scale, scale);

}

//移动

switch(type)

{

case TYPE_ALL:

case TYPE_HIGHT:

case TYPE_WIDTH:

dx = (widthScreen - srcWidth * scale) / 2f;

dy = (heightScreen - srcHight * scale) / 2f;

break;

}

matrix.postTranslate(dx, dy);

invalidate();

}

private long begin,end;

? ? public boolean onTouchEvent(MotionEvent event) {?

? ? if(gintama == null) return super.onTouchEvent(event);

? ? ? ? switch (event.getAction() & MotionEvent.ACTION_MASK) {?

? ? ? ? case MotionEvent.ACTION_DOWN:?

? ? ? ? ? ? mode = DRAG;?

? ? ? ? ? ? begin = System.currentTimeMillis();

? ? ? ? ? ? x_down = event.getX();?

? ? ? ? ? ? y_down = event.getY();?

? ? ? ? ? ? savedMatrix.set(matrix);?

? ? ? ? ? ? break;?

? ? ? ? case MotionEvent.ACTION_POINTER_DOWN:?

? ? ? ? ? ? mode = ZOOM;?

? ? ? ? ? ? oldDist = spacing(event);?

? ? ? ? ? ? oldRotation = rotation(event);?

? ? ? ? ? ? savedMatrix.set(matrix);?

? ? ? ? ? ? midPoint(mid, event);?

? ? ? ? ? ? break;?

? ? ? ? case MotionEvent.ACTION_MOVE:?

? ? ? ? ? ? if (mode == ZOOM) {?

? ? ? ? ? ? ? ? matrix1.set(savedMatrix);?

? ? ? ? ? ? ? ? float rotation = rotation(event) - oldRotation;?

? ? ? ? ? ? ? ? float newDist = spacing(event);?

? ? ? ? ? ? ? ? float scale = newDist / oldDist;?

? ? ? ? ? ? ? ? matrix1.postScale(scale, scale, mid.x, mid.y);// 縮放?

? ? ? ? ? ? ? ? matrix1.postRotate(rotation, mid.x, mid.y);// 旋轉?

? ? ? ? ? ? ? ? matrixCheck = matrixCheck();?

? ? ? ? ? ? ? ? if (matrixCheck == false) {?

? ? ? ? ? ? ? ? ? ? matrix.set(matrix1);?

? ? ? ? ? ? ? ? ? ? invalidate();?

? ? ? ? ? ? ? ? }?

? ? ? ? ? ? } else if (mode == DRAG) {?

? ? ? ? ? ? ? ? matrix1.set(savedMatrix);?

? ? ? ? ? ? ? ? matrix1.postTranslate(event.getX() - x_down, event.getY()?

? ? ? ? ? ? ? ? ? ? ? ? - y_down);// 平移?

? ? ? ? ? ? ? ? matrixCheck = matrixCheck();?

? ? ? ? ? ? ? ? if (matrixCheck == false) {?

? ? ? ? ? ? ? ? ? ? matrix.set(matrix1);?

? ? ? ? ? ? ? ? ? ? invalidate();?

? ? ? ? ? ? ? ? }?

? ? ? ? ? ? }?

? ? ? ? ? ? break;?

? ? ? ? case MotionEvent.ACTION_UP:

? ? ? ? end = System.currentTimeMillis();

? ? ? ? case MotionEvent.ACTION_POINTER_UP:?

? ? ? ? ? ? mode = NONE;

? ? ? ? ? ? break;

? ? ? ? }?

? ? ? ? //点击时间区分是否是关闭

? ? ? ? if((end - begin) < 150)

? ? ? ? {

? ? ? ? return super.onTouchEvent(event);

? ? ? ? }else{

? ? ? ? return true;

? ? ? ? }

? ? }?

?

? ? private boolean matrixCheck() {?

? ? ? ? float[] f = new float[9];?

? ? ? ? matrix1.getValues(f);?

? ? ? ? // 图片4个顶点的坐标?

? ? ? ? float x1 = f[0] * 0 + f[1] * 0 + f[2];?

? ? ? ? float y1 = f[3] * 0 + f[4] * 0 + f[5];?

? ? ? ? float x2 = f[0] * gintama.getWidth() + f[1] * 0 + f[2];?

? ? ? ? float y2 = f[3] * gintama.getWidth() + f[4] * 0 + f[5];?

? ? ? ? float x3 = f[0] * 0 + f[1] * gintama.getHeight() + f[2];?

? ? ? ? float y3 = f[3] * 0 + f[4] * gintama.getHeight() + f[5];?

? ? ? ? float x4 = f[0] * gintama.getWidth() + f[1] * gintama.getHeight() + f[2];?

? ? ? ? float y4 = f[3] * gintama.getWidth() + f[4] * gintama.getHeight() + f[5];?

? ? ? ? // 图片现宽度?

? ? ? ? double width = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));?

? ? ? ? // 缩放比率判断?

? ? ? ? if (width < widthScreen / 3 || width > widthScreen * 3) {?

? ? ? ? ? ? return true;?

? ? ? ? }?

? ? ? ? // 出界判断?

? ? ? ? if ((x1 < widthScreen / 3 && x2 < widthScreen / 3?

? ? ? ? ? ? ? ? && x3 < widthScreen / 3 && x4 < widthScreen / 3)?

? ? ? ? ? ? ? ? || (x1 > widthScreen * 2 / 3 && x2 > widthScreen * 2 / 3?

? ? ? ? ? ? ? ? ? ? ? ? && x3 > widthScreen * 2 / 3 && x4 > widthScreen * 2 / 3)?

? ? ? ? ? ? ? ? || (y1 < heightScreen / 3 && y2 < heightScreen / 3?

? ? ? ? ? ? ? ? ? ? ? ? && y3 < heightScreen / 3 && y4 < heightScreen / 3)?

? ? ? ? ? ? ? ? || (y1 > heightScreen * 2 / 3 && y2 > heightScreen * 2 / 3?

? ? ? ? ? ? ? ? ? ? ? ? && y3 > heightScreen * 2 / 3 && y4 > heightScreen * 2 / 3)) {?

? ? ? ? ? ? return true;?

? ? ? ? }?

? ? ? ? return false;?

? ? }?

?

? ? // 触碰两点间距离?

? ? 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);?

? ? }?

?

? ? // 取旋转角度?

? ? private float rotation(MotionEvent event) {?

? ? ? ? double delta_x = (event.getX(0) - event.getX(1));?

? ? ? ? double delta_y = (event.getY(0) - event.getY(1));?

? ? ? ? double radians = Math.atan2(delta_y, delta_x);?

? ? ? ? return (float) Math.toDegrees(radians);?

? ? }?

?

}

?

热点排行