前言
之前因為項目需求,其中使用到了圖片的單擊顯示取消,圖片平移縮放功能,昨天突然想再加上圖片的旋轉(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); /**
主站蜘蛛池模板:
通城县|
和平区|
山东省|
云林县|
通城县|
小金县|
开平市|
宽城|
长汀县|
揭西县|
长海县|
博湖县|
泾阳县|
兰坪|
巴楚县|
西平县|
余庆县|
治县。|
巴林左旗|
宣化县|
晋宁县|
嘉善县|
盐源县|
凌云县|
邳州市|
新源县|
新闻|
平泉县|
精河县|
元阳县|
浦北县|
舒城县|
奉贤区|
岚皋县|
芦山县|
沭阳县|
扶沟县|
和顺县|
桦南县|
元江|
两当县|