code
通过matrix.postScale对图片变形:放大缩小、左右旋转
![](http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif)
![](http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif)
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 }