歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android Matrix圖片隨意的放大縮小,拖動,翻頁

Android Matrix圖片隨意的放大縮小,拖動,翻頁

日期:2017/3/1 10:40:39   编辑:Linux編程
不知道大家有沒有買小米,小米手機自帶了一個圖片查看器,他能對圖片進行隨意的浏覽,擴大,縮小,以及翻頁,使用效果感覺非常的不錯

今天認著有時間,也就模仿他的功能寫了一下,遇到不少的挫折,看不了不少的資料,希望今天的功夫沒有白做,也希望對大家有幫助

在怎麼說功能實現了,並結合自己現在所做的項目,進行了些許的改動,感覺更容易普及的使用,因為我們很多時候要從網上下載圖片

然後對圖片進行浏覽什麼的。

在做之前,說下思路:

目標: 實現 拖,拉,拽,擴大,縮小,以及翻屏

主要分兩個大的方向:

1 拖,拉,拽,擴大,縮小 在本屏幕操作

2 翻屏是的額外的做,也並不是隨意的就能翻屏,必須滿足條件

但是當我們實現OnTouchListener 時候,他提供的只有 ACTION_DOWN, ACTION_MOVE, ACTION_UP 等操作

所以我們必須分情況,並且是三種情況:

第一種: none 可能用戶什麼也不做

第二種: DRAG 滑屏

第三種: ZOOM 擴大縮小

同時本程序考慮到有的Android山寨手機可能還不支持多點觸摸,所以同時加入了兩個button ,不支持的多點觸摸的也能對圖片進行動態的擴大或者縮小

當然主要用的知識點就是Matrix 矩陣的一些常用方法,擴大,縮小,平移,偏移,剩下的都是一點皮毛的算法邏輯了,代碼自己看啊

下面是代碼:

  1. /*
  2. * @project testbmplarge
  3. * @package com.bmp.large
  4. * @file testactivity.java
  5. * @version 1.0
  6. * @author yourname
  7. * @time 2012-1-6 ����10:58:20
  8. * CopyRight:������������Ϣ�������޹�˾ 2012-1-6
  9. */
  10. package com.bmp.large;
  11. import android.app.Activity;
  12. import android.graphics.Bitmap;
  13. import android.graphics.BitmapFactory;
  14. import android.graphics.Matrix;
  15. import android.graphics.PointF;
  16. import android.os.Bundle;
  17. import android.util.DisplayMetrics;
  18. import android.util.FloatMath;
  19. import android.util.Log;
  20. import android.view.GestureDetector;
  21. import android.view.MotionEvent;
  22. import android.view.View;
  23. import android.view.GestureDetector.OnGestureListener;
  24. import android.view.View.OnClickListener;
  25. import android.view.View.OnTouchListener;
  26. import android.widget.Button;
  27. import android.widget.ImageView;
  28. import android.widget.Toast;
  29. public class testactivity extends Activity implements OnTouchListener,OnClickListener{
  30. /*
  31. *
  32. * Class Descripton goes here.
  33. *
  34. * @class testactivity
  35. * @version 1.0
  36. * @author yourname
  37. * @time 2012-1-6 ����10:58:20
  38. */
  39. private Button big,small;
  40. private Bitmap newbitmap;
  41. private GestureDetector mGestureDetector;
  42. Matrix matrix = new Matrix();
  43. Matrix savedMatrix = new Matrix();
  44. ImageView bmp;
  45. PointF first = new PointF();
  46. PointF start = new PointF();
  47. PointF mid = new PointF();;
  48. private float oldDist;
  49. static final int NONE = 0;
  50. static final int DRAG = 1;
  51. static final int ZOOM = 2;
  52. int mode = NONE;
  53. private long beginTime,endTime;
  54. @Override
  55. public void onCreate(Bundle savedInstanceState) {
  56. super.onCreate(savedInstanceState);
  57. /*display.xml Layout */
  58. setContentView(R.layout.main);
  59. big = (Button)this.findViewById(R.id.big);
  60. small = (Button)this.findViewById(R.id.small);
  61. big.setOnClickListener(this);
  62. small.setOnClickListener(this);
  63. //獲取手機屏幕的寬和高
  64. DisplayMetrics dm = new DisplayMetrics();
  65. getWindowManager().getDefaultDisplay().getMetrics(dm);
  66. int width = dm.widthPixels;
  67. int height = dm.heightPixels;
  68. // 獲取圖片本身的寬 和高
  69. Bitmap mybitmap=BitmapFactory.decodeResource(getResources(), R.drawable.default_head);
  70. System.out.println("old==="+mybitmap.getWidth());
  71. int widOrg=mybitmap.getWidth();
  72. int heightOrg=mybitmap.getHeight();
  73. // 寬 高 比列
  74. float scaleWid = (float)width/widOrg;
  75. float scaleHeight = (float)height/heightOrg;
  76. float scale;
  77. bmp = (ImageView)this.findViewById(R.id.bmp);
  78. // 如果寬的 比列大於搞的比列 則用高的比列 否則用寬的
  79. if(scaleWid>scaleHeight)
  80. {
  81. scale = scaleHeight;
  82. }
  83. else
  84. scale = scaleWid;
  85. // matrix=new Matrix();
  86. bmp.setImageBitmap(mybitmap);
  87. matrix.postScale(scale,scale);
  88. bmp.setImageMatrix(matrix);
  89. bmp.setOnTouchListener(this);
  90. bmp.setLongClickable(true);
  91. savedMatrix.set(matrix);
  92. }
  93. @Override
  94. public boolean onTouch(View v, MotionEvent event) {
  95. // TODO Auto-generated method stub
  96. // mGestureDetector.onTouchEvent(event);
  97. System.out.println("action==="+event.getAction());
  98. switch(event.getAction()& MotionEvent.ACTION_MASK)
  99. {
  100. case MotionEvent.ACTION_DOWN:
  101. beginTime = System.currentTimeMillis();
  102. mode = DRAG;
  103. System.out.println("down");
  104. first.set(event.getX(), event.getY());
  105. start.set(event.getX(), event.getY());
  106. break;
  107. case MotionEvent.ACTION_UP:
  108. endTime = System.currentTimeMillis();
  109. System.out.println("endTime=="+(endTime - beginTime));
  110. float x = event.getX(0) - first.x;
  111. float y = event.getY(0) - first.y;
  112. // 多長的距離
  113. float move = FloatMath.sqrt(x * x + y * y);
  114. System.out.println("move=="+(move));
  115. // 計算時間和移動的距離 來判斷你想要的操作,經過測試90%情況能滿足
  116. if(endTime - beginTime<500&&move>20)
  117. {
  118. //這裡就是做你上一頁下一頁的事情了。
  119. Toast.makeText(this, "----do something-----", 1000).show();
  120. }
  121. break;
  122. case MotionEvent.ACTION_MOVE:
  123. System.out.println("move");
  124. if(mode == DRAG)
  125. {
  126. matrix.postTranslate(event.getX()-start.x, event.getY()-start.y);
  127. start.set(event.getX(), event.getY());
  128. }
  129. else
  130. {
  131. float newDist = spacing(event);
  132. if (newDist > 10f) {
  133. // matrix.set(savedMatrix);
  134. float scale = newDist / oldDist;
  135. System.out.println("scale=="+scale);
  136. matrix.postScale(scale, scale, mid.x, mid.y);
  137. }
  138. oldDist = newDist;
  139. }
  140. break;
  141. case MotionEvent.ACTION_POINTER_DOWN:
  142. oldDist = spacing(event);
  143. if (oldDist > 10f) {
  144. midPoint(mid, event);
  145. mode = ZOOM;
  146. }
  147. System.out.println("ACTION_POINTER_DOWN");
  148. break;
  149. case MotionEvent.ACTION_POINTER_UP:
  150. System.out.println("ACTION_POINTER_UP");
  151. break;
  152. }
  153. bmp.setImageMatrix(matrix);
  154. return false;
  155. }
  156. @Override
  157. public void onClick(View v) {
  158. // TODO Auto-generated method stub
  159. if(v==small)
  160. {
  161. matrix.postScale(0.5f,0.5f,0,0);
  162. // matrix.setScale(0.5f, 0.5f);
  163. bmp.setImageMatrix(matrix);
  164. }
  165. else
  166. {
  167. matrix.postScale(2f,2f);
  168. // matrix.setScale(2f,2f);
  169. bmp.setImageMatrix(matrix);
  170. }
  171. }
  172. /**
  173. * 計算拖動的距離
  174. * @param event
  175. * @return
  176. */
  177. private float spacing(MotionEvent event) {
  178. float x = event.getX(0) - event.getX(1);
  179. float y = event.getY(0) - event.getY(1);
  180. return FloatMath.sqrt(x * x + y * y);
  181. }
  182. /**
  183. * 計算兩點的之間的中間點
  184. * @param point
  185. * @param event
  186. */
  187. private void midPoint(PointF point, MotionEvent event) {
  188. float x = event.getX(0) + event.getX(1);
  189. float y = event.getY(0) + event.getY(1);
  190. point.set(x / 2, y / 2);
  191. }
  192. }
Copyright © Linux教程網 All Rights Reserved