Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在
Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。

    set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。
    post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。例如,要将一个图片旋
转30度,然后平移到(100,100)的地方,那么可以这样做:

1. Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();  
2.         mBitmap = bmp;  
3. /*首先,将缩放为100*100。这里scale的参数是比例。有一点要注意,如果直接用100/
4. bmp.getWidth()的话,会得到0,因为是整型相除,所以必须其中有一个是float型的,直接用100f就好。*/
5.         mMatrix.setScale(100f/bmp.getWidth(), 100f/bmp.getHeight());  
6. //平移到(100,100)处
7. 100, 100);  
8. //倾斜x和y轴,以(100,100)为中心。
9. 0.2f, 0.2f, 100, 100);

在android.graphics.Matrix中有对应旋转的函数:


Matrix matrix = new Matrix(); 

matrix.setRotate(90);

使用下面的方式也可以实现垂直镜像:

Matrix matrix = new Matrix();
 matrix.setScale (1.0,-1.0);
 matrix.postTraslate(0, fHeight);


缩放

matrix.postScale(scaleWidth, scaleHeight);//后面两个参数是缩放比例


1. //指定矩阵(x轴不变,y轴相反) 就是把图片倒过来
2. 1, -1);

android图片缩小和放大Matrix

public class ex04_22 extends Activity{ 

   
  
  private ImageView mImageView;
  private Button btn1,btn2;
  private TextView mTextView;
  private AbsoluteLayout layout1;
  private Bitmap bmp;
  private int id=0;
  private int displayWidth,displayHeight;
  private float scaleWidth=1,scaleHeight=1;
  private final static Stringfilename="/data/data/ex04_22.lcs/ex04_22_2.png";
    @Override
     public voidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //取得屏幕分辨率
        DisplayMetrics dm=new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        displayWidth=dm.widthPixels;
        displayHeight=dm.heightPixels-80;
        
        bmp=BitmapFactory.decodeResource(this.getResources(),R.drawable.ex04_22_1);
        layout1=(AbsoluteLayout)findViewById(R.id.layout1);
        mImageView=(ImageView)findViewById(R.id.myImageView);
        btn1=(Button)findViewById(R.id.myButton1);
        btn1.setOnClickListener(new OnClickListener(){
         public void onClick(View v){
          small();
         }
        });
        btn2=(Button)findViewById(R.id.myButton2);
        btn2.setOnClickListener(new OnClickListener(){
         public void onClick(View v){
          big();
         }
        });
     }
     private voidsmall(){
     //获得Bitmap的高和宽
     int bmpWidth=bmp.getWidth();
     int bmpHeight=bmp.getHeight();
     //设置缩小比例
     double scale=0.8;
     //计算出这次要缩小的比例
     scaleWidth=(float)(scaleWidth*scale);
     scaleHeight=(float)(scaleHeight*scale);
     //产生resize后的Bitmap对象
     Matrix matrix=new Matrix();
     matrix.postScale(scaleWidth, scaleHeight);
     Bitmap resizeBmp=Bitmap.createBitmap(bmp, 0, 0,bmpWidth, bmpHeight, matrix, true);
     if(id==0){
      layout1.removeView(mImageView);
     }
     else{
      layout1.removeView((ImageView)findViewById(id));
      
     }
     id++;
     ImageView imageView=new ImageView(this);
     imageView.setId(id);
     imageView.setImageBitmap(resizeBmp);
     layout1.addView(imageView);
     setContentView(layout1);
     btn2.setEnabled(true);
     }
     private voidbig(){
     //获得Bitmap的高和宽
     int bmpWidth=bmp.getWidth();
     int bmpHeight=bmp.getHeight();
     //设置缩小比例
     double scale=1.25;
     //计算出这次要缩小的比例
     scaleWidth=(float)(scaleWidth*scale);
     scaleHeight=(float)(scaleHeight*scale);
     //产生resize后的Bitmap对象
     Matrix matrix=new Matrix();
     matrix.postScale(scaleWidth, scaleHeight);
     Bitmap resizeBmp=Bitmap.createBitmap(bmp, 0, 0,bmpWidth, bmpHeight, matrix, true);
     if(id==0){
      layout1.removeView(mImageView);
     }
     else{
      layout1.removeView((ImageView)findViewById(id));
      
     }
     id++;
     ImageView imageView=new ImageView(this);
     imageView.setId(id);
     imageView.setImageBitmap(resizeBmp);
     layout1.addView(imageView);
     setContentView(layout1);
     if(scaleWidth*scale*bmpWidth>displayWidth||scaleHeight*scale*scaleHeight>displayHeight){
      btn2.setEnabled(false);
     }
     }
 }
1.   
2. public class MyView extends
3.       
4. private
5. private Matrix mMatrix = new
6.       
7. public
8. super(context);  
9.         initialize();  
10.     }  
11.   
12. private void
13.           
14.         Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();  
15.         mBitmap = bmp;  
16. /*首先,将缩放为100*100。这里scale的参数是比例。有一点要注意,如果直接用100/
17. bmp.getWidth()的话,会得到0,因为是整型相除,所以必须其中有一个是float型的,直接用100f就好。*/
18.         mMatrix.setScale(100f/bmp.getWidth(), 100f/bmp.getHeight());  
19. //平移到(100,100)处
20. 100, 100);  
21. //倾斜x和y轴,以(100,100)为中心。
22. 0.2f, 0.2f, 100, 100);  
23.     }  
24.       
25. @Override protected void
26. //      super.onDraw(canvas);  //如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。
27.           
28. null);  
29.     }  
30. }  
31. public class MatrixActivity extends
32.       
33. @Override
34. protected void
35. super.onCreate(savedInstanceState);  
36. "eoeAndroid教程: 缩放和旋转图片 -by:IceskYsl");  
37. new LinearLayout(this);  
38.               
39. // 加载需要操作的图片,这里是eoeAndroid的logo图片
40.                     Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),  
41.                            R.drawable.blackk);  
42.           
43. //获取这个图片的宽和高
44. int
45. int
46.               
47. //定义预转换成的图片的宽度和高度
48. int newWidth = 200;  
49. int newHeight = 200;  
50.           
51. //计算缩放率,新尺寸除原始尺寸
52. float scaleWidth = ((float) newWidth) / width;  
53. float scaleHeight = ((float) newHeight) / height;  
54.                   
55. // 创建操作图片用的matrix对象
56. new
57.                   
58. // 缩放图片动作
59.                         matrix.postScale(scaleWidth, scaleHeight);  
60.                   
61. //旋转图片 动作
62. 45);  
63.                   
64. // 创建新的图片
65. 0, 0,  
66. true);  
67.                   
68. //将上面创建的Bitmap转换成Drawable对象,使得其可以使用在ImageView, ImageButton中
69. new
70.                   
71. //创建一个ImageView
72. new ImageView(this);  
73.                   
74. // 设置ImageView的图片为上面转换的图片
75.                         imageView.setImageDrawable(bmd);  
76.                   
77. //将图片居中显示
78.                         imageView.setScaleType(ScaleType.CENTER);  
79.                   
80. //将ImageView添加到布局模板中
81.                         linLayout.addView(imageView,  
82. new
83.                                       LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT  
84.                                )  
85.                        );  
86.                   
87. // 设置为本activity的模板
88.                        setContentView(linLayout);  
89.                    }  
90.   
91.   
92.           
93.           
94.     }