前言
之前因為項目需求,其中使用到了圖片的單擊顯示取消,圖片平移縮放功能,昨天突然想再加上圖片的旋轉(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); /**
主站蜘蛛池模板:
潼南县|
桐柏县|
阳谷县|
郁南县|
满城县|
广灵县|
正定县|
黑山县|
万源市|
嵊泗县|
简阳市|
文安县|
寿光市|
收藏|
青阳县|
龙陵县|
廊坊市|
辽宁省|
蒙山县|
龙里县|
红河县|
泾源县|
静宁县|
交口县|
定州市|
长宁区|
宣武区|
曲麻莱县|
当涂县|
清涧县|
庐江县|
乐至县|
托克逊县|
绥棱县|
花垣县|
张家口市|
滦平县|
酉阳|
开江县|
平邑县|
新巴尔虎右旗|