使用.setImage设置。
package com.example.atry.test50;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import java.io.File;
/**
* Created by try on 2017/12/6.
*/
public class PictureView extends ImageView {
private Matrix matrix;
private PointF prePoint;
private PointF postPoint;
private PictureView viewSelf;
private int viewSelfWidth;
private int viewSelfHeight;
private float oldDis;
private float newDis;
private float mul;
private int mode = NONE;
private static final int NONE = 0;
private static final int DOU = 2;
private static final int SIG = 1;
public PictureView(Context context) {
super(context);
matrix = new Matrix();
viewSelf = this;
measureRealBulid();
}
public PictureView(Context context, AttributeSet attrs) {
super(context, attrs);
matrix = new Matrix();
viewSelf = this;
measureRealBulid();
}
public PictureView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
matrix = new Matrix();
viewSelf = this;
measureRealBulid();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public PictureView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
matrix = new Matrix();
viewSelf = this;
measureRealBulid();
}
public void setViewSize(int w,int h) {
viewSelfWidth = w;
viewSelfHeight = h;
}
/*
获取View的尺寸
*/
public void measureRealBulid() {
viewSelf.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
viewSelf.getViewTreeObserver().removeOnPreDrawListener(this);
viewSelfWidth = viewSelf.getWidth();
viewSelfHeight = viewSelf.getHeight();
Drawable drawable = viewSelf.getDrawable();
if (drawable != null) {
matrix.set(viewSelf.getImageMatrix());
matrix.postTranslate((viewSelfWidth - drawable.getIntrinsicWidth()) / 2, (viewSelfHeight - drawable.getIntrinsicHeight()) / 2);
viewSelf.setImageMatrix(matrix);
}
return true;
}
}
);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN : {
matrix.set(this.getImageMatrix());
prePoint = new PointF(event.getX(),event.getY());
mode = SIG;
} break;
case MotionEvent.ACTION_POINTER_DOWN : {
prePoint = centerPoint(event);
oldDis = distance(event);
mode = DOU;
} break;
case MotionEvent.ACTION_UP : case MotionEvent.ACTION_POINTER_UP: {
mode = NONE;
} break;
case MotionEvent.ACTION_MOVE: {
switch (mode) {
case NONE : break;
case SIG : {
matrix.postTranslate(event.getX() - prePoint.x,event.getY() - prePoint.y);
prePoint = new PointF(event.getX(),event.getY());
} break;
case DOU : {
postPoint = centerPoint(event);
newDis = distance(event);
mul = newDis / oldDis;
matrix.postTranslate(postPoint.x - prePoint.x,postPoint.y - prePoint.y);
matrix.postScale(mul,mul,postPoint.x,postPoint.y);
prePoint = postPoint;
} break;
}
}
}
this.setImageMatrix(matrix);
return true;
}
private PointF centerPoint(MotionEvent e) {
PointF point = new PointF((e.getX(0) + e.getX(1)) / 2,(e.getY(0) + e.getY(1)) / 2);
return point;
}
private float distance(MotionEvent e) {
float x = e.getX(1) - e.getX(0);
float y = e.getY(1) - e.getY(0);
return (float) Math.sqrt(x*x+y*y);
}
public void setImage(String filePath) {
File file = new File(filePath);
if (!file.exists()) return;
Drawable drawable;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory .decodeFile(filePath,options);
options.inSampleSize = calculateRealSize(options.outWidth,options.outHeight);
options.inJustDecodeBounds = false;
setImageBitmap(BitmapFactory.decodeFile(filePath,options));
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private int calculateRealSize(int pictureWidth, int pictureHeight) {
int inSampleSize = 1;
int realInSampleSize = 1;
if(viewSelfHeight == 0 || viewSelfWidth == 0) {
viewSelfWidth = getResources().getConfiguration().screenWidthDp;
viewSelfHeight = getResources().getConfiguration().screenHeightDp;
}
if(viewSelfWidth < pictureWidth && viewSelfHeight >= pictureHeight) {
inSampleSize = pictureWidth / viewSelfWidth;
} else if(viewSelfWidth >= pictureWidth && viewSelfHeight < pictureHeight) {
inSampleSize = pictureHeight / viewSelfHeight;
} else {
if(pictureWidth >= pictureHeight) {
inSampleSize = pictureWidth / viewSelfWidth;
} else {
inSampleSize = pictureHeight / viewSelfHeight;
}
}
while(inSampleSize == 0) {
realInSampleSize -= (inSampleSize & -inSampleSize);
inSampleSize -= realInSampleSize;
}
return realInSampleSize;
}
}