Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android實現圖片的浏覽、縮放、拖動和自動居中實例

Android實現圖片的浏覽、縮放、拖動和自動居中實例

編輯:Android開發實例

 Touch.java

  1. /** 
  2.  * 圖片浏覽、縮放、拖動、自動居中 
  3.  */ 
  4. public class Touch extends Activity implements OnTouchListener { 
  5.  
  6.     Matrix matrix = new Matrix(); 
  7.     Matrix savedMatrix = new Matrix(); 
  8.     DisplayMetrics dm; 
  9.     ImageView imgView; 
  10.     Bitmap bitmap; 
  11.  
  12.     float minScaleR;// 最小縮放比例 
  13.     static final float MAX_SCALE = 4f;// 最大縮放比例 
  14.  
  15.     static final int NONE = 0;// 初始狀態 
  16.     static final int DRAG = 1;// 拖動 
  17.     static final int ZOOM = 2;// 縮放 
  18.     int mode = NONE; 
  19.  
  20.     PointF prev = new PointF(); 
  21.     PointF mid = new PointF(); 
  22.     float dist = 1f; 
  23.  
  24.     @Override 
  25.     public void onCreate(Bundle savedInstanceState) { 
  26.         super.onCreate(savedInstanceState); 
  27.         setContentView(R.layout.scale); 
  28.         imgView = (ImageView) findViewById(R.id.imag);// 獲取控件 
  29.         bitmap = BitmapFactory.decodeResource(getResources(), this.getIntent() 
  30.                 .getExtras().getInt("IMG"));// 獲取圖片資源 
  31.         imgView.setImageBitmap(bitmap);// 填充控件 
  32.         imgView.setOnTouchListener(this);// 設置觸屏監聽 
  33.         dm = new DisplayMetrics(); 
  34.         getWindowManager().getDefaultDisplay().getMetrics(dm);// 獲取分辨率 
  35.         minZoom(); 
  36.         center(); 
  37.         imgView.setImageMatrix(matrix); 
  38.     } 
  39.  
  40.     /** 
  41.      * 觸屏監聽 
  42.      */ 
  43.     public boolean onTouch(View v, MotionEvent event) { 
  44.  
  45.         switch (event.getAction() & MotionEvent.ACTION_MASK) { 
  46.         // 主點按下 
  47.         case MotionEvent.ACTION_DOWN: 
  48.             savedMatrix.set(matrix); 
  49.             prev.set(event.getX(), event.getY()); 
  50.             mode = DRAG; 
  51.             break; 
  52.         // 副點按下 
  53.         case MotionEvent.ACTION_POINTER_DOWN: 
  54.             dist = spacing(event); 
  55.             // 如果連續兩點距離大於10,則判定為多點模式 
  56.             if (spacing(event) > 10f) { 
  57.                 savedMatrix.set(matrix); 
  58.                 midPoint(mid, event); 
  59.                 mode = ZOOM; 
  60.             } 
  61.             break; 
  62.         case MotionEvent.ACTION_UP: 
  63.         case MotionEvent.ACTION_POINTER_UP: 
  64.             mode = NONE; 
  65.             break; 
  66.         case MotionEvent.ACTION_MOVE: 
  67.             if (mode == DRAG) { 
  68.                 matrix.set(savedMatrix); 
  69.                 matrix.postTranslate(event.getX() - prev.x, event.getY() 
  70.                         - prev.y); 
  71.             } else if (mode == ZOOM) { 
  72.                 float newDist = spacing(event); 
  73.                 if (newDist > 10f) { 
  74.                     matrix.set(savedMatrix); 
  75.                     float tScale = newDist / dist; 
  76.                     matrix.postScale(tScale, tScale, mid.x, mid.y); 
  77.                 } 
  78.             } 
  79.             break; 
  80.         } 
  81.         imgView.setImageMatrix(matrix); 
  82.         CheckView(); 
  83.         return true; 
  84.     } 
  85.  
  86.     /** 
  87.      * 限制最大最小縮放比例,自動居中 
  88.      */ 
  89.     private void CheckView() { 
  90.         float p[] = new float[9]; 
  91.         matrix.getValues(p); 
  92.         if (mode == ZOOM) { 
  93.             if (p[0] < minScaleR) { 
  94.                 matrix.setScale(minScaleR, minScaleR); 
  95.             } 
  96.             if (p[0] > MAX_SCALE) { 
  97.                 matrix.set(savedMatrix); 
  98.             } 
  99.         } 
  100.         center(); 
  101.     } 
  102.  
  103.     /** 
  104.      * 最小縮放比例,最大為100% 
  105.      */ 
  106.     private void minZoom() { 
  107.         minScaleR = Math.min( 
  108.                 (float) dm.widthPixels / (float) bitmap.getWidth(), 
  109.                 (float) dm.heightPixels / (float) bitmap.getHeight()); 
  110.         if (minScaleR < 1.0) { 
  111.             matrix.postScale(minScaleR, minScaleR); 
  112.         } 
  113.     } 
  114.  
  115.     private void center() { 
  116.         center(true, true); 
  117.     } 
  118.  
  119.     /** 
  120.      * 橫向、縱向居中 
  121.      */ 
  122.     protected void center(boolean horizontal, boolean vertical) { 
  123.  
  124.         Matrix m = new Matrix(); 
  125.         m.set(matrix); 
  126.         RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
  127.         m.mapRect(rect); 
  128.  
  129.         float height = rect.height(); 
  130.         float width = rect.width(); 
  131.  
  132.         float deltaX = 0, deltaY = 0; 
  133.  
  134.         if (vertical) { 
  135.             // 圖片小於屏幕大小,則居中顯示。大於屏幕,上方留空則往上移,下方留空則往下移 
  136.             int screenHeight = dm.heightPixels; 
  137.             if (height < screenHeight) { 
  138.                 deltaY = (screenHeight - height) / 2 - rect.top; 
  139.             } else if (rect.top > 0) { 
  140.                 deltaY = -rect.top; 
  141.             } else if (rect.bottom < screenHeight) { 
  142.                 deltaY = imgView.getHeight() - rect.bottom; 
  143.             } 
  144.         } 
  145.  
  146.         if (horizontal) { 
  147.             int screenWidth = dm.widthPixels; 
  148.             if (width < screenWidth) { 
  149.                 deltaX = (screenWidth - width) / 2 - rect.left; 
  150.             } else if (rect.left > 0) { 
  151.                 deltaX = -rect.left; 
  152.             } else if (rect.right < screenWidth) { 
  153.                 deltaX = screenWidth - rect.right; 
  154.             } 
  155.         } 
  156.         matrix.postTranslate(deltaX, deltaY); 
  157.     } 
  158.  
  159.     /** 
  160.      * 兩點的距離 
  161.      */ 
  162.     private float spacing(MotionEvent event) { 
  163.         float x = event.getX(0) - event.getX(1); 
  164.         float y = event.getY(0) - event.getY(1); 
  165.         return FloatMath.sqrt(x * x + y * y); 
  166.     } 
  167.  
  168.     /** 
  169.      * 兩點的中點 
  170.      */ 
  171.     private void midPoint(PointF point, MotionEvent event) { 
  172.         float x = event.getX(0) + event.getX(1); 
  173.         float y = event.getY(0) + event.getY(1); 
  174.         point.set(x / 2, y / 2); 
  175.     } 

scale.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent" 
  5.     android:layout_gravity="center" > 
  6.  
  7.     <ImageView 
  8.         android:id="@+id/imag" 
  9.         android:layout_width="fill_parent" 
  10.         android:layout_height="fill_parent" 
  11.         android:layout_gravity="center" 
  12.         android:scaleType="matrix" > 
  13.     </ImageView> 
  14.  
  15. </FrameLayout> 

轉自:

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved