歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 大圖片拖拽縮放

Android 大圖片拖拽縮放

日期:2017/3/1 10:20:15   编辑:Linux編程

這篇Android圖片拖拽縮放也是我在項目中用到的,今天整理一下,將源碼奉獻給大家,希望對大家以後碰到相似的問題有幫助。

這篇就不做過多介紹了,直接上源碼:

  1. public class SpacePageActivity extends Activity {
  2. private LinearLayout linnerLayout_spacepage;
  3. private RelativeLayout relativeLayout_spacepage;
  4. private Button btn_spacepage_back;
  5. private Button btn_spacepage_save;
  6. private static Boolean isTrue=false;
  7. private static String IMAGE_MIME_TYPE ;
  8. private ImageView image_spacePage;
  9. private ProgressDialog dialog;
  10. private Bitmap bitmap;
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. // TODO Auto-generated method stub
  14. super.onCreate(savedInstanceState);
  15. requestWindowFeature(Window.FEATURE_NO_TITLE);//隱藏標題
  16. setContentView(R.layout.spacepage);
  17. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  18. initHead();
  19. if(isNetworkAvailable()){
  20. image_spacePage=(ImageView) findViewById(R.id.image_spacepage);
  21. btn_spacepage_save=(Button) findViewById(R.id.btn_spacepage_save);
  22. image_spacePage.setOnTouchListener(new MulitPointTouchListener(image_spacePage));
  23. image_spacePage.setScaleType(ScaleType.CENTER_INSIDE);
  24. //加載成功
  25. String urls="http://epaper.yzdsb.com.cn/201201/04/yz2104_7.jpg";
  26. bitmap=returnBitMap(urls);
  27. if(null!=bitmap){
  28. image_spacePage.setImageBitmap(bitmap);
  29. }
  30. }
  31. }
  32. public Bitmap returnBitMap(String url) {
  33. if(null==url || "".equals(url)){
  34. return null;
  35. }
  36. URL myFileUrl = null;
  37. Bitmap bitmap = null;
  38. try {
  39. myFileUrl = new URL(url);
  40. } catch (MalformedURLException e) {
  41. e.printStackTrace();
  42. }
  43. try {
  44. HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
  45. conn.setConnectTimeout(2000);
  46. conn.setDoInput(true);
  47. conn.connect();
  48. InputStream is = conn.getInputStream();
  49. bitmap = BitmapFactory.decodeStream(is);
  50. is.close();
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. }
  54. return bitmap;
  55. }
  56. public class MulitPointTouchListener implements OnTouchListener {
  57. Matrix matrix = new Matrix();
  58. Matrix savedMatrix = new Matrix();
  59. public ImageView image;
  60. static final int NONE = 0;
  61. static final int DRAG = 1;
  62. static final int ZOOM = 2;
  63. int mode = NONE;
  64. PointF start = new PointF();
  65. PointF mid = new PointF();
  66. float oldDist = 1f;
  67. public MulitPointTouchListener(ImageView image) {
  68. super();
  69. this.image = image;
  70. }
  71. @Override
  72. public boolean onTouch(View v, MotionEvent event) {
  73. this.image.setScaleType(ScaleType.MATRIX);
  74. ImageView view = (ImageView) v;
  75. // dumpEvent(event);
  76. switch (event.getAction() & MotionEvent.ACTION_MASK) {
  77. case MotionEvent.ACTION_DOWN:
  78. Log.w("FLAG", "ACTION_DOWN");
  79. matrix.set(view.getImageMatrix());
  80. savedMatrix.set(matrix);
  81. start.set(event.getX(), event.getY());
  82. mode = DRAG;
  83. break;
  84. case MotionEvent.ACTION_POINTER_DOWN:
  85. Log.w("FLAG", "ACTION_POINTER_DOWN");
  86. oldDist = spacing(event);
  87. if (oldDist > 10f) {
  88. savedMatrix.set(matrix);
  89. midPoint(mid, event);
  90. mode = ZOOM;
  91. }
  92. break;
  93. case MotionEvent.ACTION_UP:
  94. Log.w("FLAG", "ACTION_UP");
  95. case MotionEvent.ACTION_POINTER_UP:
  96. Log.w("FLAG", "ACTION_POINTER_UP");
  97. mode = NONE;
  98. break;
  99. case MotionEvent.ACTION_MOVE:
  100. Log.w("FLAG", "ACTION_MOVE");
  101. if (mode == DRAG) {
  102. matrix.set(savedMatrix);
  103. matrix.postTranslate(event.getX() - start.x, event.getY()
  104. - start.y);
  105. } else if (mode == ZOOM) {
  106. float newDist = spacing(event);
  107. if (newDist > 10f) {
  108. matrix.set(savedMatrix);
  109. float scale = newDist / oldDist;
  110. matrix.postScale(scale, scale, mid.x, mid.y);
  111. }
  112. }
  113. break;
  114. }
  115. view.setImageMatrix(matrix);
  116. return true;
  117. }
  118. private float spacing(MotionEvent event) {
  119. float x = event.getX(0) - event.getX(1);
  120. float y = event.getY(0) - event.getY(1);
  121. return FloatMath.sqrt(x * x + y * y);
  122. }
  123. private void midPoint(PointF point, MotionEvent event) {
  124. float x = event.getX(0) + event.getX(1);
  125. float y = event.getY(0) + event.getY(1);
  126. point.set(x / 2, y / 2);
  127. }
  128. }
  129. private void initHead() {
  130. linnerLayout_spacepage = (LinearLayout) findViewById(R.id.linnerLayout_spacepage);
  131. relativeLayout_spacepage=(RelativeLayout) findViewById(R.id.relativeLayout_spacepage);
  132. btn_spacepage_back = (Button) findViewById(R.id.btn_spacepage_back);
  133. btn_spacepage_back.setOnClickListener(new OnClickListener() {
  134. @Override
  135. public void onClick(View v) {
  136. // TODO Auto-generated method stub
  137. finish();
  138. }
  139. });
  140. btn_spacepage_save = (Button) findViewById(R.id.btn_spacepage_save);
  141. }
  142. protected boolean isNetworkAvailable() {
  143. ConnectivityManager connectivity = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
  144. if (connectivity == null) {
  145. Log.i("NetWorkState", "Unavailabel");
  146. return false;
  147. } else {
  148. NetworkInfo[] info = connectivity.getAllNetworkInfo();
  149. if (info != null) {
  150. for (int i = 0; i < info.length; i++) {
  151. if (info[i].getState() == NetworkInfo.State.CONNECTED) {
  152. Log.i("NetWorkState", "Availabel");
  153. return true;
  154. }
  155. }
  156. }
  157. }
  158. return false;
  159. }
  160. @Override
  161. protected void onStop() {
  162. // TODO Auto-generated method stub
  163. if(bitmap!=null){
  164. if(!bitmap.isRecycled()){
  165. bitmap.recycle(); //回收圖片所占的內存
  166. bitmap=null;
  167. System.gc(); //提醒系統及時回收
  168. }
  169. }
  170. super.onStop();
  171. }
  172. @Override
  173. protected void onDestroy() {
  174. // TODO Auto-generated method stub
  175. super.onDestroy();
  176. if(bitmap!=null){
  177. if(!bitmap.isRecycled()){
  178. bitmap.recycle(); //回收圖片所占的內存
  179. bitmap=null;
  180. System.gc(); //提醒系統及時回收
  181. }
  182. }
  183. }
  184. }

因為是大圖片,在onDestroy的時候要recycle掉,這樣系統才會定時回收掉,System.gc();是提醒系統回收,雖然java這種垃圾回收機制不用我們自己關心對象的回收,但是這也給android開發人員帶來了不好的一面,如果系統回收不及時很可能就造成了內存溢出了。什麼時候手機不擔心內存使用了就好了。

運行一下看看效果:

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved