可縮放性ImageView(可以放大縮小)
阿新 • • 發佈:2018-12-02
由於專案需求的原因,最近一直在研究可縮放性ImageView,用本文來記錄一下最近所學:
該ImageView的實現功能有:
1)初步開啟時,圖片按比例滿屏(填充ImageView)顯示。
2)在放大縮小過程中,可以控制最大放大比例和最小縮小比例。
3)在縮放過程中,若圖片的寬或高小於ImageView,則在圖片在寬或高居中顯示。
4)在放大後,可以移動圖片,並且限制好移動的邊界,不會超出圖片。
5)實現雙擊放大或縮小的功能。(若當前圖片顯示為最大的比例則縮小為最小比例,若不是最小比例則放大了最大比例)
在講程式碼之前,首先應該說說一個類,Matrix。因為我們在處理圖片的過程中,需要圖片的位移,縮放等等,而Matrix剛好就是幫我們封裝好了這些資料,具體的,大家可以看看這篇文章: android 從matrix獲取處理過的圖片的實際寬度重點是瞭解Matrix裡面陣列的含義。
上程式碼,具體的說明程式碼都有一一介紹:
MyZoomImageView.java檔案:
[java] view plain copy
- package com.xiaoyan.doubletouch;
- import android.content.Context;
- import android.graphics.Matrix;
- import android.graphics.PointF;
- import android.graphics.drawable.Drawable;
- import android.util.AttributeSet;
- import android.util.FloatMath;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.ViewTreeObserver;
- import android.view.ViewTreeObserver.OnGlobalLayoutListener;
- import android.widget.ImageView;
- /**
- * 縮放ImageView
- *
- * @author xiejinxiong
- *
- */
- public class MyZoomImageView extends ImageView {
- /** ImageView高度 */
- private int imgHeight;
- /** ImageView寬度 */
- private int imgWidth;
- /** 圖片高度 */
- private int intrinsicHeight;
- /** 圖片寬度 */
- private int intrinsicWidth;
- /** 最大縮放級別 */
- private float mMaxScale = 2.0f;
- /** 最小縮放級別 */
- private float mMinScale = 0.2f;
- /** 用於記錄拖拉圖片移動的座標位置 */
- private Matrix matrix = new Matrix();
- /** 用於記錄圖片要進行拖拉時候的座標位置 */
- private Matrix currentMatrix = new Matrix();
- /** 記錄第一次點選的時間 */
- private long firstTouchTime = 0;
- /** 時間點選的間隔 */
- private int intervalTime = 250;
- /** 第一次點完座標 */
- private PointF firstPointF;
- public MyZoomImageView(Context context) {
- super(context);
- initUI();
- }
- public MyZoomImageView(Context context, AttributeSet attrs) {
- super(context, attrs);
- initUI();
- }
- public MyZoomImageView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- // TODO Auto-generated constructor stub
- initUI();
- }
- /**
- * 初始化UI
- */
- private void initUI() {
- this.setScaleType(ScaleType.FIT_CENTER);
- this.setOnTouchListener(new TouchListener());
- getImageViewWidthHeight();
- getIntrinsicWidthHeight();
- }
- /**
- * 獲得圖片內在寬高
- */
- private void getIntrinsicWidthHeight() {
- Drawable drawable = this.getDrawable();
- // 初始化bitmap的寬高
- intrinsicHeight = drawable.getIntrinsicHeight();
- intrinsicWidth = drawable.getIntrinsicWidth();
- }
- private final class TouchListener implements OnTouchListener {
- /** 記錄是拖拉照片模式還是放大縮小照片模式 */
- private int mode = 0;// 初始狀態
- /** 拖拉照片模式 */
- private static final int MODE_DRAG = 1;
- /** 放大縮小照片模式 */
- private static final int MODE_ZOOM = 2;
- /** 用於記錄開始時候的座標位置 */
- private PointF startPoint = new PointF();
- /** 兩個手指的開始距離 */
- private float startDis;
- /** 兩個手指的中間點 */
- private PointF midPoint;
- public boolean onTouch(View v, MotionEvent event) {&nb