国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

基于Android 實現(xiàn)圖片平移、縮放、旋轉(zhuǎn)同時進行

2020-04-11 11:16:43
字體:
供稿:網(wǎng)友

前言

之前因為項目需求,其中使用到了圖片的單擊顯示取消,圖片平移縮放功能,昨天突然想再加上圖片的旋轉(zhuǎn)功能,在網(wǎng)上看了很多相關(guān)的例子,可是沒看到能同時實現(xiàn)我想要的功能的。

需求:

(1)圖片平移、縮放、旋轉(zhuǎn)等一系列操作后,圖片需要自動居中顯示。

(2)圖片旋轉(zhuǎn)后選自動水平顯示或者垂直顯示

(3)圖片在放大縮小的同時都能旋轉(zhuǎn)

Demo實現(xiàn)部分效果截圖

Demo主要代碼

Java

MainActivity.javapackage com.practice.noyet.rotatezoomimageview;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.graphics.PointF;import android.graphics.RectF;import android.os.AsyncTask;import android.os.Bundle;import android.util.DisplayMetrics;import android.view.MotionEvent;import android.view.View;import android.widget.ImageView;import com.ypy.eventbus.EventBus;import java.io.File;import java.math.BigDecimal;/*** package: com.practice.noyet.rotatezoomimageview* Created by noyet on 2015/11/11.*/public class MainActivity extends Activity implements View.OnTouchListener {  private ImageView mImageView;  private PointF point0 = new PointF();  private PointF pointM = new PointF();  private final int NONE = 0;  /**   * 平移   */  private final int DRAG = 1;  /**   * 旋轉(zhuǎn)、縮放   */  private final int ZOOM = 2;  /**   * 設(shè)定事件模式   */  private int mode = NONE;  /**   * 圖片縮放矩陣   */  private Matrix matrix = new Matrix();  /**   * 保存觸摸前的圖片縮放矩陣   */  private Matrix savedMatrix = new Matrix();  /**   * 保存觸點移動過程中的圖片縮放矩陣   */  private Matrix matrix1 = new Matrix();  /**   * 屏幕高度   */  private int displayHeight;  /**   * 屏幕寬度   */  private int displayWidth;  /**   * 最小縮放比例   */  protected float minScale = 1f;  /**   * 最大縮放比例   */  protected float maxScale = 3f;  /**   * 當(dāng)前縮放比例   */  protected float currentScale = 1f;  /**   * 多點觸摸2個觸摸點間的起始距離   */  private float oldDist;  /**   * 多點觸摸時圖片的起始角度   */  private float oldRotation = 0;  /**   * 旋轉(zhuǎn)角度   */  protected float rotation = 0;  /**   * 圖片初始寬度   */  private int imgWidth;  /**   * 圖片初始高度   */  private int imgHeight;  /**   * 設(shè)置單點觸摸退出圖片顯示時,單點觸摸的靈敏度(可針對不同手機單獨設(shè)置)   */  protected final int MOVE_MAX = 2;  /**   * 單點觸摸時手指觸發(fā)的‘MotionEvent.ACTION_MOVE'次數(shù)   */  private int fingerNumMove = 0;  private Bitmap bm;  /**   * 保存matrix縮放比例   */  private float matrixScale= 1;  /*private String imagePath;*/  /**   * 顯示被存入緩存中的網(wǎng)絡(luò)圖片   *   * @param event 觀察者事件   */  public void onEventMainThread(CustomEventBus event) {    if (event == null) {      return;    }    if (event.type == CustomEventBus.EventType.SHOW_PICTURE) {      bm = (Bitmap) event.obj;      showImage();    }  }  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    initData();  }  public void initData() {    // TODO Auto-generated method stub    bm = BitmapFactory.decodeResource(getResources(), R.drawable.alipay);    DisplayMetrics dm = getResources().getDisplayMetrics();    displayWidth = dm.widthPixels;    displayHeight = dm.heightPixels;    mImageView = (ImageView) findViewById(R.id.image_view);    mImageView.setOnTouchListener(this);    showImage();    //顯示網(wǎng)絡(luò)圖片時使用    /*File file = MainApplication.getInstance().getImageCache()        .getDiskCache().get(圖片路徑);    if (!file.exists()) {      Toast.makeText(this, "圖片路徑錯誤", Toast.LENGTH_SHORT).show();    } else {      new MyTask().execute(file);    }*/  }  @Override  public boolean onTouch(View view, MotionEvent event) {    ImageView imageView = (ImageView) view;    switch (event.getAction() & MotionEvent.ACTION_MASK) {      case MotionEvent.ACTION_DOWN:        savedMatrix.set(matrix);        point0.set(event.getX(), event.getY());        mode = DRAG;        System.out.println("MotionEvent--ACTION_DOWN");        break;      case MotionEvent.ACTION_POINTER_DOWN:        oldDist = spacing(event);        oldRotation = rotation(event);        savedMatrix.set(matrix);        setMidPoint(pointM, event);        mode = ZOOM;        System.out.println("MotionEvent--ACTION_POINTER_DOWN---" + oldRotation);        break;      case MotionEvent.ACTION_UP:        if (mode == DRAG & (fingerNumMove this.finish();        }        checkView();        centerAndRotate();        imageView.setImageMatrix(matrix);        System.out.println("MotionEvent--ACTION_UP");        fingerNumMove = 0;        break;      case MotionEvent.ACTION_POINTER_UP:        mode = NONE;        System.out.println("MotionEvent--ACTION_POINTER_UP");        break;      case MotionEvent.ACTION_MOVE:        operateMove(event);        imageView.setImageMatrix(matrix1);        fingerNumMove++;        System.out.println("MotionEvent--ACTION_MOVE");        break;    }    return true;  }  @Override  protected void onDestroy() {    // TODO Auto-generated method stub    super.onDestroy();    if (bm != null & !bm.isRecycled()) {      bm.recycle(); // 回收圖片所占的內(nèi)存      System.gc(); // 提醒系統(tǒng)及時回收    }  }  /**   * 顯示圖片   */  private void showImage() {    imgWidth = bm.getWidth();    imgHeight = bm.getHeight();    mImageView.setImageBitmap(bm);    matrix.setScale(1, 1);    centerAndRotate();    mImageView.setImageMatrix(matrix);  }  /**   * 觸點移動時的操作   *   * @param event 觸摸事件   */  private void operateMove(MotionEvent event) {    matrix1.set(savedMatrix);    switch (mode) {      case DRAG:        matrix1.postTranslate(event.getX() - point0.x, event.getY() - point0.y);        break;      case ZOOM:        rotation = rotation(event) - oldRotation;        float newDist = spacing(event);        float scale = newDist / oldDist;        currentScale = (scale > 3.5f) ? 3.5f : scale;        System.out.println("縮放倍數(shù)---" + currentScale);        System.out.println("旋轉(zhuǎn)角度---" + rotation);        /** 

主站蜘蛛池模板:
潼南县|
桐柏县|
阳谷县|
郁南县|
满城县|
广灵县|
正定县|
黑山县|
万源市|
嵊泗县|
简阳市|
文安县|
寿光市|
收藏|
青阳县|
龙陵县|
廊坊市|
辽宁省|
蒙山县|
龙里县|
红河县|
泾源县|
静宁县|
交口县|
定州市|
长宁区|
宣武区|
曲麻莱县|
当涂县|
清涧县|
庐江县|
乐至县|
托克逊县|
绥棱县|
花垣县|
张家口市|
滦平县|
酉阳|
开江县|
平邑县|
新巴尔虎右旗|