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. }