新浪微博图片缩放的开发实例

移动开发 Android
很难为你的应用程序得到正确的图像缩放吗?是你的图片过大,造成内存问题?还是图片不正确缩放造成不良用户体验的结果?本文具体给出了开发时会用到的图片缩放效果。

Android开发中有时会用到图片缩放效果,即点击图片时显示缩放按钮,过一会消失。本文就根据新浪微博的图片缩放给大家写一个实例,以供参考。下面直接上代码。

  1. package com.Johnson.image.zoom;     
  2. import android.app.Activity;     
  3. import android.app.Dialog;     
  4. import android.app.ProgressDialog;     
  5. import android.content.DialogInterface;     
  6. import android.content.DialogInterface.OnKeyListener;     
  7. import android.graphics.Bitmap;     
  8. import android.graphics.BitmapFactory;     
  9. import android.graphics.Matrix;     
  10. import android.os.Bundle;     
  11. import android.os.Handler;     
  12. import android.util.DisplayMetrics;     
  13. import android.util.Log;     
  14. import android.view.KeyEvent;     
  15. import android.view.MotionEvent;     
  16. import android.view.View;     
  17. import android.view.View.OnClickListener;     
  18. import android.widget.ImageView;     
  19. import android.widget.LinearLayout;     
  20. import android.widget.RelativeLayout;     
  21. import android.widget.ZoomControls;     
  22. public class MainActivity extends Activity {     
  23.         /** Called when the activity is first created. */     
  24.   private final int LOADING_IMAGE = 1;     
  25.   public static String KEY_IMAGEURI = "ImageUri";     
  26.   private ZoomControls zoom;     
  27.   private ImageView mImageView;     
  28.   private LinearLayout layoutImage;     
  29.   private int displayWidth;     
  30.   private int displayHeight;     
  31.   /**图片资源*/     
  32.   private Bitmap bmp;     
  33.   /**宽的缩放比例*/     
  34.   private float scaleWidth = 1;     
  35.   /**高的缩放比例*/     
  36.   private float scaleHeight = 1;     
  37.   /**用来计数放大+1    缩小-1*/     
  38.   private int    zoomNumber=0;     
  39.   /**点击屏幕显示缩放按钮,三秒消失*/     
  40.   private int showTime=3000;     
  41.   RelativeLayout rl;     
  42.   Handler mHandler = new Handler();     
  43.   private Runnable task = new Runnable() {     
  44.     public void run() {     
  45.       zoom.setVisibility(View.INVISIBLE);             
  46.     }     
  47.   };     
  48.         @Override     
  49.         public void onCreate(Bundle savedInstanceState) {     
  50.                 super.onCreate(savedInstanceState);     
  51.                 setContentView(R.layout.main);     
  52.     //showDialog(LOADING_IMAGE);     
  53.     //图片是从网络上获取的话,需要加入滚动条     
  54.         bmp=BitmapFactory.decodeResource(getResources(), R.drawable.image);     
  55.     //removeDialog(LOADING_IMAGE);     
  56.          initZoom();     
  57. }     
  58.   @Override     
  59.   protected Dialog onCreateDialog(int id) {     
  60.     switch (id) {     
  61.     case LOADING_IMAGE: {     
  62.       final ProgressDialog dialog = new ProgressDialog(this);     
  63.       dialog.setOnKeyListener(new OnKeyListener() {     
  64.         @Override     
  65.         public boolean onKey(DialogInterface dialog, int keyCode,     
  66.             KeyEvent event) {     
  67.           if (keyCode == KeyEvent.KEYCODE_BACK) {     
  68.             finish();     
  69.           }     
  70.           return false;     
  71.         }     
  72.       });     
  73.       dialog.setMessage("正在加载图片请稍后...");     
  74.       dialog.setIndeterminate(true);     
  75.       dialog.setCancelable(true);     
  76.       return dialog;     
  77.     }     
  78.     }     
  79.     return null;     
  80.   }     
  81.   public void initZoom() {     
  82.     /* 取得屏幕分辨率大小 */     
  83.     DisplayMetrics dm = new DisplayMetrics();     
  84.     getWindowManager().getDefaultDisplay().getMetrics(dm);     
  85.     displayWidth = dm.widthPixels;     
  86.     displayHeight = dm.heightPixels;     
  87.     mImageView = (ImageView) findViewById(R.id.myImageView);     
  88.     mImageView.setImageBitmap(bmp);     
  89.     layoutImage = (LinearLayout) findViewById(R.id.layoutImage);     
  90.     mImageView.setOnClickListener(new OnClickListener() {     
  91.       @Override     
  92.       public void onClick(View v) {     
  93.         // TODO Auto-generated method stub     
  94.                                 /**    
  95.                                  * 在图片上和整个view上同时添加点击监听捕捉屏幕    
  96.                                  * 点击事件,来显示放大缩小按钮       
  97.                                  * */            
  98.         zoom.setVisibility(View.VISIBLE);     
  99.         mHandler.removeCallbacks(task);     
  100.         mHandler.postDelayed(task, showTime);     
  101.       }     
  102.     });     
  103.     layoutImage.setOnClickListener(new OnClickListener() {     
  104.       @Override     
  105.       public void onClick(View v) {     
  106.         // TODO Auto-generated method stub     
  107.             
  108.         zoom.setVisibility(View.VISIBLE);     
  109.         mHandler.removeCallbacks(task);     
  110.         mHandler.postDelayed(task, showTime);     
  111.       }     
  112.     });     
  113.     zoom = (ZoomControls) findViewById(R.id.zoomcontrol);     
  114.     zoom.setIsZoomInEnabled(true);     
  115.     zoom.setIsZoomOutEnabled(true);     
  116.     // 图片放大     
  117.     zoom.setOnZoomInClickListener(new OnClickListener() {     
  118.       public void onClick(View v) {     
  119.         big();     
  120.       }     
  121.     });     
  122.     // 图片减小     
  123.     zoom.setOnZoomOutClickListener(new OnClickListener() {     
  124.       public void onClick(View v) {     
  125.         small();     
  126.       }     
  127.     });     
  128.     zoom.setVisibility(View.VISIBLE);     
  129.     mHandler.postDelayed(task, showTime);     
  130.   }     
  131.   @Override     
  132.   public boolean onTouchEvent(MotionEvent event) {     
  133.     // TODO Auto-generated method stub     
  134.          /**    
  135.                  * 在图片上和整个view上同时添加点击监听捕捉屏幕    
  136.                  * 点击事件,来显示放大缩小按钮       
  137.                  * */         
  138.     zoom.setVisibility(View.VISIBLE);     
  139.     mHandler.removeCallbacks(task);     
  140.     mHandler.postDelayed(task, showTime);     
  141.     return false;     
  142.   }     
  143.   @Override     
  144.   public boolean onKeyDown(int keyCode, KeyEvent event) {     
  145.     // TODO Auto-generated method stub     
  146.     super.onKeyDown(keyCode, event);     
  147.     return true;     
  148.   }     
  149.   /* 图片缩小的method */     
  150.   private void small() {     
  151.     --zoomNumber;     
  152.     int bmpWidth = bmp.getWidth();     
  153.     int bmpHeight = bmp.getHeight();     
  154.     Log.i("","bmpWidth = " + bmpWidth + ", bmpHeight = " + bmpHeight);     
  155.     /* 设置图片缩小的比例 */     
  156.     double scale = 0.8;     
  157.     /* 计算出这次要缩小的比例 */     
  158.     scaleWidth = (float) (scaleWidth * scale);     
  159.     scaleHeight = (float) (scaleHeight * scale);     
  160.     /* 产生reSize后的Bitmap对象 */     
  161.     Matrix matrix = new Matrix();     
  162.     matrix.postScale(scaleWidth, scaleHeight);     
  163.     Bitmap resizeBmp = Bitmap.createBitmap(bmp, 00, bmpWidth, bmpHeight,     
  164.         matrix, true);     
  165.     mImageView.setImageBitmap(resizeBmp);     
  166.     /* 限制缩小尺寸 */     
  167.     if ((scaleWidth * scale * bmpWidth < bmpWidth / 4     
  168.         || scaleHeight * scale * bmpHeight > bmpWidth /4     
  169.         || scaleWidth * scale * bmpWidth > displayWidth / 5     
  170.         || scaleHeight * scale * bmpHeight > displayHeight / 5)&&(zoomNumber==-1) ){     
  171.     zoom.setIsZoomOutEnabled(false);     
  172.     } else {     
  173.     zoom.setIsZoomOutEnabled(true);     
  174.     }     
  175.     zoom.setIsZoomInEnabled(true);     
  176.     System.gc();     
  177.   }     
  178.   /* 图片放大的method */     
  179.   private void big() {     
  180.     ++zoomNumber;     
  181.     int bmpWidth = bmp.getWidth();     
  182.     int bmpHeight = bmp.getHeight();     
  183.     /* 设置图片放大的比例 */     
  184.     double scale = 1.25;     
  185.     /* 计算这次要放大的比例 */     
  186.     scaleWidth = (float) (scaleWidth * scale);     
  187.     scaleHeight = (float) (scaleHeight * scale);     
  188.     /* 产生reSize后的Bitmap对象 */     
  189.     Matrix matrix = new Matrix();     
  190.     matrix.postScale(scaleWidth, scaleHeight);     
  191.     Bitmap resizeBmp = Bitmap.createBitmap(bmp, 00, bmpWidth, bmpHeight,     
  192.         matrix, true);     
  193.     mImageView.setImageBitmap(resizeBmp);     
  194.     /* 限制放大尺寸 */     
  195.     if (scaleWidth * scale * bmpWidth > bmpWidth * 4     
  196.         || scaleHeight * scale * bmpHeight > bmpWidth * 4     
  197.         || scaleWidth * scale * bmpWidth > displayWidth * 5     
  198.         || scaleHeight * scale * bmpHeight > displayHeight * 5) {     
  199.       zoom.setIsZoomInEnabled(false);     
  200.     } else {     
  201.       zoom.setIsZoomInEnabled(true);     
  202.     }     
  203.     zoom.setIsZoomOutEnabled(true);     
  204.   System.gc();     
  205.   }     
  206. }   

布局文件如下:

  1.     <?xml version="1.0" encoding="utf-8"?>         
  2.     <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"         
  3.             android:orientation="vertical"         
  4.             android:layout_width="fill_parent"         
  5.             android:layout_height="fill_parent"         
  6.             android:id="@+id/layout1"         
  7.                 >         
  8.          <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"         
  9.                     android:layout_width="fill_parent"         
  10.                     android:layout_height="fill_parent"         
  11.                  android:id="@+id/rl"        
  12.                     >         
  13.             <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"                
  14.                     android:layout_width="fill_parent"         
  15.                     android:layout_height="fill_parent"            
  16.                     android:layout_weight="19"         
  17.                     android:scrollbars="none"         
  18.                     android:fadingEdge="vertical"     
  19.                     android:layout_gravity="center"        
  20.                     android:gravity="center"         
  21.                  >         
  22.             <HorizontalScrollView            
  23.                     android:layout_height="fill_parent"         
  24.                     android:layout_width="fill_parent"     
  25.                     android:scrollbars="none"     
  26.                      android:layout_gravity="center"        
  27.                     android:gravity="center"        
  28.                     android:id="@+id/hs"     
  29.                         >         
  30.                     <LinearLayout     
  31. android:orientation="horizontal"         
  32. android:layout_width="fill_parent"         
  33. android:layout_height="fill_parent"         
  34.                             android:id="@+id/layoutImage"        
  35.                             android:layout_gravity="center"        
  36.                             android:gravity="center"         
  37.                             >         
  38.                             <ImageView        
  39. android:layout_gravity="center"        
  40.                                 android:gravity="center"         
  41. android:id="@+id/myImageView"         
  42. android:layout_width="fill_parent"         
  43. android:layout_height="fill_parent"         
  44. android:layout_weight="19"         
  45. android:paddingTop="5dip"         
  46. android:paddingBottom="5dip"        
  47.                                     />         
  48.                     </LinearLayout>         
  49.             </HorizontalScrollView >         
  50.             </ScrollView>        
  51.                  <ZoomControls android:id="@+id/zoomcontrol"     
  52.           android:layout_width="wrap_content" android:layout_height="wrap_content"     
  53.           android:layout_centerHorizontal="true"     
  54.                 android:layout_alignParentBottom="true"     
  55.           >     
  56.         </ZoomControls>     
  57.             </RelativeLayout>         
  58.     </FrameLayout>      
责任编辑:闫佳明 来源: oschina
相关推荐

2011-07-26 09:58:24

2013-07-10 14:15:38

php新浪微博

2015-09-24 18:08:50

微博架构架构演进架构

2013-07-01 18:34:47

个推案例新浪微博

2011-12-08 16:10:18

2015-01-21 15:28:16

Android源码新浪微博

2011-07-22 10:38:55

HTC新浪Facebook

2011-12-08 16:31:43

新浪微博开放平台

2011-12-08 16:51:55

新浪微博开放平台

2017-04-27 11:15:05

新浪微博LNMP架构侯青龙

2014-01-07 10:46:39

2020-09-07 14:00:23

腾讯微博微信互联网

2010-04-28 08:38:19

微博开发杨卫华

2011-05-27 08:41:26

JavascriptFirefox

2013-07-16 15:21:53

微微博新浪微博AndroidAndroid开发学习

2013-03-20 10:09:22

微博风云大数据社会化数据分析

2011-08-30 14:48:02

2011-06-29 09:57:45

2011-07-01 13:29:15

2014-04-22 10:34:57

新浪微博Redis
点赞
收藏

51CTO技术栈公众号