先上代码吧,之后再进行补充和代码优化。
activity_main.xml的代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@color/colorBlack" xmlns:android="http://schemas.android.com/apk/res/android"> <ImageView android:id="@+id/main_imgZooming" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="matrix" android:layout_gravity="center" android:src="@mipmap/guide_2"/> </LinearLayout>
MainActivity.java的代码如下:
package com.deepreality.imagezoomingdemo; import android.app.Activity; import android.graphics.Matrix; import android.graphics.PointF; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.FloatMath; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; public class MainActivity extends Activity implements View.OnTouchListener { private ImageView img_test; // 縮放控制 private Matrix matrix = new Matrix(); private Matrix savedMatrix = new Matrix(); // 不同状态的表示: private static final int NONE = 0; private static final int DRAG = 1; private static final int ZOOM = 2; private int mode = NONE; // 定义第一个按下的点,两只接触点的重点,以及出事的两指按下的距离: private PointF startPoint = new PointF(); private PointF midPoint = new PointF(); private float oriDis = 1f; /* * (non-Javadoc) * * @see android.app.Activity#onCreate(android.os.Bundle) */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); img_test = (ImageView) this.findViewById(R.id.main_imgZooming); img_test.setOnTouchListener(this); } // 计算两个触摸点之间的距离 private float distance(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return Float.valueOf(String.valueOf(Math.sqrt(x * x + y * y))) ; } // 计算两个触摸点的中点 private PointF middle(MotionEvent event) { float x = event.getX(0) + event.getX(1); float y = event.getY(0) + event.getY(1); return new PointF(x / 2, y / 2); } @Override public boolean onTouch(View v, MotionEvent event) { ImageView view = (ImageView) v; switch (event.getAction() & MotionEvent.ACTION_MASK) { // 单指 case MotionEvent.ACTION_DOWN: matrix.set(view.getImageMatrix()); savedMatrix.set(matrix); startPoint.set(event.getX(), event.getY()); mode = DRAG; break; // 双指 case MotionEvent.ACTION_POINTER_DOWN: oriDis = distance(event); if (oriDis > 10f) { savedMatrix.set(matrix); midPoint = middle(event); mode = ZOOM; } break; // 手指放开 case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mode = NONE; break; // 单指滑动事件 case MotionEvent.ACTION_MOVE: if (mode == DRAG) { // 是一个手指拖动 matrix.set(savedMatrix); matrix.postTranslate(event.getX() - startPoint.x, event.getY() - startPoint.y); } else if (mode == ZOOM) { // 两个手指滑动 float newDist = distance(event); if (newDist > 10f) { matrix.set(savedMatrix); float scale = newDist / oriDis; matrix.postScale(scale, scale, midPoint.x, midPoint.y); } } break; } // 设置ImageView的Matrix view.setImageMatrix(matrix); return true; } }