1. 程式人生 > >可縮放性ImageView(可以放大縮小)

可縮放性ImageView(可以放大縮小)

由於專案需求的原因,最近一直在研究可縮放性ImageView,用本文來記錄一下最近所學:

該ImageView的實現功能有:

1)初步開啟時,圖片按比例滿屏(填充ImageView)顯示。

2)在放大縮小過程中,可以控制最大放大比例和最小縮小比例。

3)在縮放過程中,若圖片的寬或高小於ImageView,則在圖片在寬或高居中顯示。

4)在放大後,可以移動圖片,並且限制好移動的邊界,不會超出圖片。

5)實現雙擊放大或縮小的功能。(若當前圖片顯示為最大的比例則縮小為最小比例,若不是最小比例則放大了最大比例)

在講程式碼之前,首先應該說說一個類,Matrix。因為我們在處理圖片的過程中,需要圖片的位移,縮放等等,而Matrix剛好就是幫我們封裝好了這些資料,具體的,大家可以看看這篇文章:

android 從matrix獲取處理過的圖片的實際寬度重點是瞭解Matrix裡面陣列的含義。

上程式碼,具體的說明程式碼都有一一介紹:

MyZoomImageView.java檔案:

[java]  view plain  copy
  1. package com.xiaoyan.doubletouch;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Matrix;  
  5. import android.graphics.PointF;  
  6. import android.graphics.drawable.Drawable;  
  7. import android.util.AttributeSet;  
  8. import android.util.FloatMath;  
  9. import android.view.MotionEvent;  
  10. import android.view.View;  
  11. import android.view.ViewTreeObserver;  
  12. import android.view.ViewTreeObserver.OnGlobalLayoutListener;  
  13. import android.widget.ImageView;  
  14.   
  15. /** 
  16.  * 縮放ImageView 
  17.  *  
  18.  * @author xiejinxiong 
  19.  *  
  20.  */  
  21. public class MyZoomImageView extends ImageView {  
  22.   
  23.     /** ImageView高度 */  
  24.     private int imgHeight;  
  25.     /** ImageView寬度 */  
  26.     private int imgWidth;  
  27.     /** 圖片高度 */  
  28.     private int intrinsicHeight;  
  29.     /** 圖片寬度 */  
  30.     private int intrinsicWidth;  
  31.     /** 最大縮放級別 */  
  32.     private float mMaxScale = 2.0f;  
  33.     /** 最小縮放級別 */  
  34.     private float mMinScale = 0.2f;  
  35.     /** 用於記錄拖拉圖片移動的座標位置 */  
  36.     private Matrix matrix = new Matrix();  
  37.     /** 用於記錄圖片要進行拖拉時候的座標位置 */  
  38.     private Matrix currentMatrix = new Matrix();  
  39.     /** 記錄第一次點選的時間 */  
  40.     private long firstTouchTime = 0;  
  41.     /** 時間點選的間隔 */  
  42.     private int intervalTime = 250;  
  43.     /** 第一次點完座標 */  
  44.     private PointF firstPointF;  
  45.   
  46.     public MyZoomImageView(Context context) {  
  47.         super(context);  
  48.         initUI();  
  49.     }  
  50.   
  51.     public MyZoomImageView(Context context, AttributeSet attrs) {  
  52.         super(context, attrs);  
  53.         initUI();  
  54.     }  
  55.   
  56.     public MyZoomImageView(Context context, AttributeSet attrs, int defStyle) {  
  57.         super(context, attrs, defStyle);  
  58.         // TODO Auto-generated constructor stub  
  59.         initUI();  
  60.     }  
  61.   
  62.     /** 
  63.      * 初始化UI 
  64.      */  
  65.     private void initUI() {  
  66.   
  67.         this.setScaleType(ScaleType.FIT_CENTER);  
  68.         this.setOnTouchListener(new TouchListener());  
  69.   
  70.         getImageViewWidthHeight();  
  71.         getIntrinsicWidthHeight();  
  72.     }  
  73.   
  74.     /** 
  75.      * 獲得圖片內在寬高 
  76.      */  
  77.     private void getIntrinsicWidthHeight() {  
  78.         Drawable drawable = this.getDrawable();  
  79.   
  80.         // 初始化bitmap的寬高  
  81.         intrinsicHeight = drawable.getIntrinsicHeight();  
  82.         intrinsicWidth = drawable.getIntrinsicWidth();  
  83.     }  
  84.   
  85.     private final class TouchListener implements OnTouchListener {  
  86.   
  87.         /** 記錄是拖拉照片模式還是放大縮小照片模式 */  
  88.         private int mode = 0;// 初始狀態  
  89.         /** 拖拉照片模式 */  
  90.         private static final int MODE_DRAG = 1;  
  91.         /** 放大縮小照片模式 */  
  92.         private static final int MODE_ZOOM = 2;  
  93.         /** 用於記錄開始時候的座標位置 */  
  94.         private PointF startPoint = new PointF();  
  95.         /** 兩個手指的開始距離 */  
  96.         private float startDis;  
  97.         /** 兩個手指的中間點 */  
  98.         private PointF midPoint;  
  99.   
  100.         public boolean onTouch(View v, MotionEvent event) {&nb