Android 图片放大缩小移动(记录)
学习记录下
//UI界面
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:scaleType="matrix"
android:src="@drawable/de" />
//主功能代码
public class MainActivity extends AppCompatActivity {
private ImageView iv;
public final int MODE_NONE=0;//什么都没做
public final int MODE_DRAG=1;//拖拽
public final int MODE_ZOOM=2;//放大缩小
public int MODE;//一开始的状态
public Matrix StartMatrix=new Matrix();//当前矩阵
public Matrix CurrentMatrix=new Matrix();//变化的矩阵
public PointF pointF=new PointF();//初始坐标
public float distance;//一开始手指两点之间的距离
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initEvent();
}
private void initEvent() {
iv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()&event.getActionMasked())
{
case MotionEvent.ACTION_DOWN:
/*按下屏幕触发该事件*/
MODE=MODE_DRAG;
StartMatrix.set(iv.getImageMatrix());
pointF.set(event.getX(),event.getY());
break;
case MotionEvent.ACTION_POINTER_DOWN:
/*第二个手指触碰屏幕焦点*/
MODE=MODE_ZOOM;
CurrentMatrix.set(StartMatrix);
distance=getDistance(event);
break;
case MotionEvent.ACTION_MOVE:
/*移动*/
if(MODE==MODE_DRAG)
{
CurrentMatrix.set(StartMatrix);
CurrentMatrix.postTranslate(event.getX()-pointF.x,event.getY()-pointF.y);
}
if(MODE==MODE_ZOOM)
{
float CurrentDistance=getDistance(event);
//移动后的两点之间的距离
float scale=CurrentDistance/distance;
//计算缩放倍数 现在的距离/以前的距离=倍数
CurrentMatrix.set(StartMatrix);
CurrentMatrix.postScale(scale,scale,pointF.x,pointF.y);
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
/*手指离开屏幕 失去焦点*/
MODE=MODE_NONE;
break;
}
iv.setImageMatrix(CurrentMatrix);
return true;
}
});
}
public float getDistance(MotionEvent event)
{
/*求两点之间的距离*/
float x= (event.getX(0)-event.getX(1))*(event.getX(0)-event.getX(1));
float y=(event.getY(0)-event.getY(1))*(event.getY(0)-event.getY(1));
return (float)Math.sqrt((x+y));
}
private void initView() {
iv = (ImageView) findViewById(R.id.iv);
}
}