首先是android:scaletype 通俗地讲 控制ImageView中的图片与ImageView
该控件的大小匹配方式
有8中做个简单的讲解可以实验
matrix 这个是比较重要的设置了该属性之后ImageView控件就可以在代码中通过Matrix进行缩小放大控制图片了
fitXY 控件中的图片不按照比例放大或缩小到控件的大小
fitStart 控件中的图片按照控件的宽度放大或缩小到控件的大小 并且显示在控件中的上方
fitcenter 控件中的图片按照控件的宽度放大或缩小到控件的大小 并且显示在控件中的中间
fitEnd 控件中的图片按照控件的宽度放大或缩小到控件的大小 并且显示在控件中的下方
center 控件中的图片不做任何缩放 并且居中显示
centerinside 控件中的图片小于控件大小时 不做变化居中显示 若大于
缩小至控件大小并居中显示
centercrop 控件图片大小 一定大于等于 控件大小 且居中显示
在这里要实现多点触碰缩小放大图片 首先设置android:scaleType="matrix"
为ImageView控件绑定OnTouchListener监听器
在回调方法OnTouch中处理事件
ACTION_DOWN 手指按下ACTION_MOVE手指移动 ACTION_UP手指离开
ACTION_POINTER_DOWN多只手指按下 ACTION_POINTER_UP一只手指离开了
下面是拖动和缩放图片的源码
package com.example.testdragscale;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.util.FloatMath;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView mImage;
@Override
protected
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImage = (ImageView) this.findViewById(R.id.imageview);
mImage.setOnTouchListener(new TouchListener());
}
private
final class TouchListener implements OnTouchListener {
private PointF startPoint = new PointF();
private float dx;
private float dy;
Matrix matrix = new Matrix();
Matrix currentMatrix = new Matrix();
private int mode;
private static final int DRAG = 1;
private static final int SCALE = 2;
private PointF midPoint;
float endDis,startDis;
@Override
public boolean onTouch(View v,
MotionEvent event) {
switch
(event.getAction()&MotionEvent.ACTION_MASK) {
case
MotionEvent.ACTION_DOWN:
mode
= DRAG;
currentMatrix.set(mImage.getImageMatrix());
startPoint.set(event.getX(),event.getY());
break;
case
MotionEvent.ACTION_MOVE:
if(mode
== DRAG) {
dx
= event.getX()-startPoint.x;
dy
= event.getY()-startPoint.y;
matrix.set(currentMatrix);
matrix.postTranslate(dx,
dy);
}
else if(mode == SCALE) {
endDis
= getDistance(event);
float
sca = endDis/startDis;
matrix.set(currentMatrix);
matrix.postScale(sca,sca,midPoint.x,midPoint.y);
}
break;
case
MotionEvent.ACTION_POINTER_DOWN:
mode
= SCALE;
startDis
= getDistance(event);
midPoint
= getMidPoint(event);
currentMatrix.set(mImage.getImageMatrix());
break;
case
MotionEvent.ACTION_POINTER_UP:
mode
= 0;
break;
default:
break;
}
mImage.setImageMatrix(matrix);
return
true;
}
private float
getDistance(MotionEvent event) {
float dx =
event.getX(1) - event.getX(0);
float dy =
event.getY(1) - event.getY(0);
return
FloatMath.sqrt(dx*dx + dy*dy);
}
private PointF
getMidPoint(MotionEvent event) {
float midx =
(event.getX(1)+event.getX(0))/2;
float midy =
(event.getY(1)+event.getY(0))/2;
return new
PointF(midx, midy);
}
}
@Override
public
boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}