原理图:
1)
2)
代码如下:
1、在drawable目录下导入要演示的图片
2、main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="matrix"
android:src="@drawable/a"
/>
</LinearLayout>
3、MainActivity
package com.njupt.drag_scale1;
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
private ImageView iv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iv = (ImageView) findViewById(R.id.iv);
iv.setOnTouchListener(new MyOnTouchListener());
}
private final class MyOnTouchListener implements OnTouchListener{
private PointF startPoint = new PointF();//初始点
private Matrix mCurrentMatrix = new Matrix();//图片初始的matrix值
private Matrix mMatrix = new Matrix();//来一个临时的matrix
private PointF midPointF;//中心点
private float midDistance;//两点间的距离
private int type = 0;
private final static int DRAG = 1;
private final static int SCALE = 2;
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
int action = event.getAction()&MotionEvent.ACTION_MASK;
switch (action) {
case MotionEvent.ACTION_DOWN://手指按下
float x = event.getX();
float y = event.getY();
startPoint.set(x, y);
mCurrentMatrix.set(iv.getImageMatrix());//图片没有移动的位置
type = DRAG;
break;
case MotionEvent.ACTION_POINTER_1_DOWN://屏幕上有一根手指,再按下一根手指
mCurrentMatrix.set(iv.getImageMatrix());//图片没有缩放的大小
midPointF = getMidPointF(event);
midDistance = getMidDistance(event);
type = SCALE;
break;
case MotionEvent.ACTION_MOVE://手指移动
if(type == DRAG){
mMatrix.set(mCurrentMatrix);
float dx = event.getX() - startPoint.x;
float dy = event.getY() - startPoint.y;
mMatrix.postTranslate(dx, dy);
}else if(type == SCALE){
mMatrix.set(mCurrentMatrix);
float distance = getMidDistance(event);//得到当前两个手指间的距离
float sx = distance/midDistance;//得到缩放的倍数
mMatrix.postScale(sx, sx, midPointF.x, midPointF.y);
}
break;
case MotionEvent.ACTION_UP://手指弹起
case MotionEvent.ACTION_POINTER_1_UP://弹起一根手指,屏幕上还有一根手指
type = 0;
break;
default:
break;
}
iv.setImageMatrix(mMatrix);
return true;
}
}
//得到中心点
private PointF getMidPointF(MotionEvent event){
float x = (event.getX(1) + event.getX(0))/2;
float y = (event.getY(1) + event.getY(0))/2;
return new PointF(x, y);
}
//计算两点间的距离
private float getMidDistance(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);
}
}