//获取图片方向
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
//旋转图片
public static Bitmap rotate(Bitmap b, int degrees) {
if(degrees==0){
return b;
}
if (degrees != 0 && b != null) {
Matrix m = new Matrix();
m.setRotate(degrees, (float) b.getWidth() ,
(float) b.getHeight() );
try {
Bitmap b2 = Bitmap.createBitmap(b, 0, 0, b.getWidth(),
b.getHeight(), m, true);
if (b != b2) {
b.recycle(); // Android开发网再次提示Bitmap操作完应该显示的释放
b = b2;
}
} catch (OutOfMemoryError ex) {
// Android123建议大家如何出现了内存不足异常,最好return 原始的bitmap对象。.
}
}
return b;
}
//根据uri获取绝对路径
protected String getAbsoluteImagePath(Uri uri)
{
// can post image
String [] proj={MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery( uri,
proj, // Which columns to return
null, // WHERE clause; which rows to return (all rows)
null, // WHERE clause selection arguments (none)
null); // Order-by clause (ascending by name)
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
//支持多点触控的缩放与移动
<span style="white-space:pre"> </span> Matrix matrix=new Matrix();
<span style="white-space:pre"> </span> Matrix savedMatrix=new Matrix();
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span> PointF start=new PointF();
<span style="white-space:pre"> </span> PointF mid=new PointF();
<span style="white-space:pre"> </span> float oldDist;
<span style="white-space:pre"> </span> //模式
<span style="white-space:pre"> </span> static final int NONE=0;
<span style="white-space:pre"> </span> static final int DRAG=1;
<span style="white-space:pre"> </span> static final int ZOOM=2;
<span style="white-space:pre"> </span> int mode=NONE;
<span style="white-space:pre"> </span>ImageView image ;
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
// TODO Auto-generated method stub
ImageView myImageView=(ImageView) arg0;
switch(arg1.getAction()&MotionEvent.ACTION_MASK){
//设置拖拉模式
case MotionEvent.ACTION_DOWN:
matrix.set(myImageView.getImageMatrix());
savedMatrix.set(matrix);
start.set(arg1.getX(),arg1.getY());
mode=DRAG;
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode=NONE;
break;
//设置多点触摸模式
case MotionEvent.ACTION_POINTER_DOWN:
oldDist=spacing(arg1);
if(oldDist>10f){
savedMatrix.set(matrix);
midPoint(mid, arg1);
mode=ZOOM;
}
break;
//若为DRAG模式,则点击移动图片
case MotionEvent.ACTION_MOVE:
if(mode==DRAG){
matrix.set(savedMatrix);
matrix.postTranslate(arg1.getX()-start.x,arg1.getY()-start.y);
}
//若为ZOOM模式,则点击触摸缩放
else if(mode==ZOOM){
float newDist=spacing(arg1);
if(newDist>10f){
matrix.set(savedMatrix);
float scale=newDist/oldDist;
//设置硕放比例和图片的中点位置
matrix.postScale(scale,scale, mid.x,mid.y);
}
}
break;
}
myImageView.setImageMatrix(matrix);
return true;
}
//计算移动距离
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);
}
要在xml中将imageview设置为android:scaleType="matrix"