我的Android進階之旅------>android Matrix圖片隨意的放大縮小,拖動
阿新 • • 發佈:2019-02-04
step1:新建一個專案DragAndZoom,並準備一張照片放在res/drawable-hdpi目錄下,如下圖所示:
step2: 設定應用的UI介面,在main.xml中設定:
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
-
android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <ImageView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:src="@drawable/wall"
- android:id="@+id/imageView"
- android:scaleType="matrix"
- /><!-- 指定為matrix型別 -->
-
</LinearLayout>
step3:MainActivity.java中實現具體的需求
- package cn.roco.drag;
- 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;
- publicclass MainActivity extends Activity {
- private ImageView imageView;
- @Override
- publicvoid onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- imageView = (ImageView) this.findViewById(R.id.imageView);
- imageView.setOnTouchListener(new TouchListener());
- }
- privatefinalclass TouchListener implements OnTouchListener {
- /** 記錄是拖拉照片模式還是放大縮小照片模式 */
- privateint mode = 0;// 初始狀態
- /** 拖拉照片模式 */
- privatestaticfinalint MODE_DRAG = 1;
- /** 放大縮小照片模式 */
- privatestaticfinalint MODE_ZOOM = 2;
- /** 用於記錄開始時候的座標位置 */
- private PointF startPoint = new PointF();
- /** 用於記錄拖拉圖片移動的座標位置 */
- private Matrix matrix = new Matrix();
- /** 用於記錄圖片要進行拖拉時候的座標位置 */
- private Matrix currentMatrix = new Matrix();
- /** 兩個手指的開始距離 */
- privatefloat startDis;
- /** 兩個手指的中間點 */
- private PointF midPoint;
- @Override
- publicboolean onTouch(View v, MotionEvent event) {
- /** 通過與運算保留最後八位 MotionEvent.ACTION_MASK = 255 */
- switch (event.getAction() & MotionEvent.ACTION_MASK) {
- // 手指壓下螢幕
- case MotionEvent.ACTION_DOWN:
- mode = MODE_DRAG;
- // 記錄ImageView當前的移動位置
- currentMatrix.set(imageView.getImageMatrix());
- startPoint.set(event.getX(), event.getY());
- break;
- // 手指在螢幕上移動,改事件會被不斷觸發
- case MotionEvent.ACTION_MOVE:
- // 拖拉圖片
- if (mode == MODE_DRAG) {
- float dx = event.getX() - startPoint.x; // 得到x軸的移動距離
- float dy = event.getY() - startPoint.y; // 得到x軸的移動距離
- // 在沒有移動之前的位置上進行移動
- matrix.set(currentMatrix);
- matrix.postTranslate(dx, dy);
- }
- // 放大縮小圖片
- elseif (mode == MODE_ZOOM) {
- float endDis = distance(event);// 結束距離
- if (endDis > 10f) { // 兩個手指併攏在一起的時候畫素大於10
- float scale = endDis / startDis;// 得到縮放倍數
- matrix.set(currentMatrix);
- matrix.postScale(scale, scale,midPoint.x,midPoint.y);
- }
- }
- break;
- // 手指離開螢幕
- case MotionEvent.ACTION_UP:
- // 當觸點離開螢幕,但是螢幕上還有觸點(手指)
- case MotionEvent.ACTION_POINTER_UP:
- mode = 0;
- break;
- // 當螢幕上已經有觸點(手指),再有一個觸點壓下螢幕
- case MotionEvent.ACTION_POINTER_DOWN:
- mode = MODE_ZOOM;
- /** 計算兩個手指間的距離 */
- startDis = distance(event);