code

通过matrix.postScale对图片变形:放大缩小、左右旋转

View Code
  1 package com.example.flexd14;
  2 
  3 import android.os.Bundle;
  4 import android.app.Activity;
  5 import android.graphics.Bitmap;
  6 import android.graphics.BitmapFactory;
  7 import android.graphics.Matrix;
  8 import android.graphics.drawable.BitmapDrawable;
  9 import android.util.DisplayMetrics;
 10 import android.util.Log;
 11 import android.view.Menu;
 12 import android.view.View;
 13 import android.view.View.OnClickListener;
 14 import android.widget.AbsoluteLayout;
 15 import android.widget.Button;
 16 import android.widget.ImageView;
 17 
 18 /**
 19  * 通过矩阵变化得到新的bitmap
 20  *
 21  */
 22 public class MainActivity extends Activity {
 23     
 24     private ImageView iv;
 25     
 26     //zoom
 27     private Button bt1;
 28     private Button bt2;
 29     private AbsoluteLayout layout1;
 30     private Bitmap bm;
 31     private int id = 0;//缩放标记
 32     private int displayWidth;//屏幕宽度
 33     private int displayHeight;
 34     private float scaleWidth = 1;//修改比例后的宽度
 35     private float scaleHeight = 1;
 36     
 37     //rotate
 38     private Button bt3;
 39     private Button bt4;
 40     private int scaleTimes;//
 41     private int scaleAngle;//角度
 42     
 43 
 44     @Override
 45     protected void onCreate(Bundle savedInstanceState) {
 46         super.onCreate(savedInstanceState);
 47         setContentView(R.layout.activity_main);
 48 
 49         //取屏幕分辨率
 50         DisplayMetrics dm = new DisplayMetrics();
 51         getWindowManager().getDefaultDisplay().getMetrics(dm);
 52         displayWidth = dm.widthPixels;
 53         displayHeight = dm.heightPixels-80;//减去button的高度
 54         Log.i("displayWidth", String.valueOf(displayWidth));
 55         Log.i("displayHeight", String.valueOf(displayHeight));
 56 
 57         //Widgets
 58         BitmapFactory.Options opts = new BitmapFactory.Options();//采样值 解决java.lang.OutOfMemoryError
 59         opts.inSampleSize = 3;
 60         bm = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher, opts);//
 61         
 62         iv = (ImageView) findViewById(R.id.iv1);
 63         layout1 = (AbsoluteLayout) findViewById(R.id.layout1);
 64         bt1 = (Button) findViewById(R.id.bt1);
 65         bt2 = (Button) findViewById(R.id.bt2);
 66         bt3 = (Button) findViewById(R.id.bt3);
 67         bt4 = (Button) findViewById(R.id.bt4);
 68         
 69         //
 70         scaleTimes = 1;
 71         scaleAngle = 10;
 72         iv.setImageBitmap(bm);
 73         
 74         //
 75         bt1.setOnClickListener(new OnClickListener() {
 76             
 77             @Override
 78             public void onClick(View v) {
 79                 // TODO Auto-generated method stub
 80                 zoomIn();
 81             }
 82         });
 83         bt2.setOnClickListener(new OnClickListener() {
 84             
 85             @Override
 86             public void onClick(View v) {
 87                 // TODO Auto-generated method stub
 88                 zoomOut();
 89             }
 90         });
 91         bt3.setOnClickListener(new OnClickListener() {
 92             
 93             @Override
 94             public void onClick(View v) {
 95                 // TODO Auto-generated method stub
 96                 rotateACW();
 97             }
 98         });
 99         bt4.setOnClickListener(new OnClickListener() {
100             
101             @Override
102             public void onClick(View v) {
103                 // TODO Auto-generated method stub
104                 rotateCW();
105             }
106         });
107 
108     }
109 
110     /**
111      * Zoom In ++
112      */
113     public void zoomIn(){
114         //计算当前宽高 按照比例缩放后的宽高
115         //当前宽高
116         int bmWidth = bm.getWidth();
117         int bmHeight = bm.getHeight();
118         //设定缩放比例
119         double scale=1.1;
120         //缩放后
121         scaleWidth = (float)scale*bmWidth;
122         scaleHeight = (float)scale*bmHeight;
123         //矩阵运算
124         Matrix matrix = new Matrix();
125         matrix.postScale(scaleWidth, scaleHeight);
126         //新控件
127         Log.i("bmWidth", String.valueOf(bmWidth));
128         Log.i("bmHeight", String.valueOf(bmHeight));
129         Bitmap scaleBm = Bitmap.createBitmap(bm,0,0,bmWidth,bmHeight,matrix,true);
130         
131         //imageView
132         if(0==id){
133             //第一次按则移除最初的imageView
134             layout1.removeView(iv);
135         }else{
136             //否则移除上次产生的imageView
137             layout1.removeView((ImageView)findViewById(id));
138         }
139         id++;
140         
141         //new ImageView
142         ImageView iv2 = new ImageView(this);
143         iv2.setId(id);
144         iv2.setImageBitmap(scaleBm);
145         layout1.addView(iv2);
146         setContentView(layout1);
147         
148         // 如果下次放大后超过屏幕大小了则把button禁止
149         if (scaleWidth * scale > displayWidth || scaleHeight * scale > displayHeight) {
150             Log.i("<>", "Button disabled");
151             bt1.setEnabled(false);
152         }
153         
154     }
155     
156     /**
157      * Zoom Out --
158      */
159     public void zoomOut(){
160         int bmWidth2 = bm.getWidth();
161         int bmHeight2 = bm.getHeight();
162         float scale2 = (float) 0.8;
163         
164         scaleWidth = scale2*bmWidth2;
165         scaleHeight = scale2*bmHeight2;
166         
167         Matrix matrix2 = new Matrix();
168         matrix2.postScale(scaleWidth, scaleHeight);
169         Bitmap scaleBm2 = Bitmap.createBitmap(bm,0,0,bmWidth2,bmHeight2,matrix2,true);
170         //(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
171         
172         if(0==id){
173             layout1.removeView(iv);
174         }else{
175             layout1.removeView((ImageView)findViewById(id));
176         }
177         id++;
178         
179         ImageView iv3 = new ImageView(this);
180         iv3.setId(id);
181         iv3.setImageBitmap(scaleBm2);
182         layout1.addView(iv3);
183         setContentView(layout1);
184         
185         bt1.setEnabled(true);
186     }
187     
188     /**
189      * 向左逆时针旋转
190      */
191     public void rotateACW(){
192         //最大角度
193         scaleAngle--;
194         if(scaleAngle<-5)
195         {
196           scaleAngle = -5;
197         }
198         
199         //宽高比
200         int bmWidth = bm.getWidth();
201         int bmHeight = bm.getHeight();
202         int newWidth = bmWidth * scaleTimes;
203         int newHeight = bmHeight * scaleTimes;
204         
205         float scaleWidth = ((float) newWidth) / bmWidth;
206         float scaleHeight = ((float) newHeight) / bmHeight;
207         
208         //矩阵变形
209         Matrix matrix = new Matrix();
210         //大小
211         matrix.postScale(scaleWidth, scaleHeight);
212         //旋转
213         //matrix.postRotate(5*ScaleAngle);
214         matrix.setRotate(5*scaleAngle);
215         
216         //从bp变得新的bitmap
217         Bitmap rotateBm = Bitmap.createBitmap(bm, 0, 0, bmWidth, bmHeight, matrix, true);
218         BitmapDrawable bd = new BitmapDrawable(rotateBm);
219         iv.setImageDrawable(bd);
220     }
221     
222     /**
223      * 向右顺时针旋转
224      */
225     public void rotateCW(){
226         scaleAngle++;
227         if(scaleAngle>5)
228         {
229           scaleAngle = 5;
230         }
231 
232         //scaleTimes = 2;
233         int bmWidth = bm.getWidth();
234         int bmHeight = bm.getHeight();
235         int newWidth = bmWidth * scaleTimes;
236         int newHeight = bmHeight * scaleTimes;
237 
238         float scaleWidth = ((float) newWidth) / bmWidth; 
239         float scaleHeight = ((float) newHeight) / bmHeight; 
240         
241         Matrix matrix = new Matrix(); 
242         matrix.postScale(scaleWidth, scaleHeight);
243         
244         matrix.postRotate(5*scaleAngle);
245         //matrix.setRotate(5*scaleAngle);
246 
247         Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, bmWidth, bmHeight, matrix, true);
248         BitmapDrawable bd = new BitmapDrawable(resizedBitmap);
249         iv.setImageDrawable(bd);
250     }
251     
252     @Override
253     public boolean onCreateOptionsMenu(Menu menu) {
254         // Inflate the menu; this adds items to the action bar if it is present.
255         getMenuInflater().inflate(R.menu.activity_main, menu);
256         return true;
257     }
258 
259 }

 

posted on 2013-01-31 17:09  hanxun  阅读(2403)  评论(0编辑  收藏  举报