http://blog.csdn.net/csxwc/article/details/10400455
Matrix是Android提供的矩阵工具类,用于控制组件或图形的旋转,平移,缩放等。
Matrix的参数由9个float值组成(cosX,-sinX,translateX,sinX,cosX,0,0,scale):
sinX和cosX表示旋转角度的sin值和cos值(顺时针方向),tanslateX,translateY表示x和y的平移量,scale表示缩放比例。
可通过:Matrix.setValues(cosX,-sinX,translateX,sinX,cosX,0,0,scale)进行设置。
Matrix的使用方法(步骤):
- 获取Matrix对象
- 调用Matrix的方法进行平移,缩放等。
- 将Matrix所做的变换应用到指定的图形或者组件上。
Matrix提供了如下方法来控制缩放,平移,旋转:
- setTranslate(float x,float y):控制平移。
- setSkew(float kx,float ky):控制Matrix进行倾斜,kx,ky为X、Y方向上的倾斜距离。
- setSkew(float kx, float ky,float px, float py):控制Matrix以px,py为轴心进行倾斜,(kx,ky)为X、Y方向上的倾斜距离。
- setRotate(float rotate):控制Matrix进行旋转,rotate为旋转角度。
- setRotate(float rotate,float px,float py):控制Matrix以px,py为中心进行旋转,rotate为旋转角度。
- setScale(float sx,float sy):控制Matrix进行缩放,sx、sy为X、Y方向上的缩放比例。
- setScale(float sx,float xy,float px,float py):控制Matrix以px、py为中心进行缩放,sx、sy为X、Y方向上的缩放比例。
在对Matrix的缩放、旋转、平移等设置完后,通过Canvas提供的drawBitmap(Bitmap bitmap,Matrix m,Paint paint)方法对Matrix进行调用。
下面是对Matrix的简单应用:
- public class MainActivity extends Activity {
- private Button btn_left,btn_right,btn_big,btn_small;
- public MyView view;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- final MyView view = new MyView(this);
- setContentView(R.layout.activity_main);
- RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl);
- rl.addView(view);
- btn_left = (Button) findViewById(R.id.btn_left);
- btn_right = (Button) findViewById(R.id.btn_right);
- btn_big = (Button) findViewById(R.id.btn_big);
- btn_small = (Button) findViewById(R.id.btn_small);
- btn_left.setOnClickListener(new OnClickListener() {
- //这里写的有点麻烦。。。
- @Override
- public void onClick(View v) {
- view.isScale = false;
- view.sx += 0.1;
- view.invalidate();
- }
- });
- btn_right.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- view.isScale = false;
- view.sx -= 0.1;
- view.invalidate();
- }
- });
- btn_big.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- view.isScale = true;
- if(view.scale<2.0){
- view.scale += 0.1;
- }
- view.invalidate();
- }
- });
- btn_small.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- view.isScale = true;
- if(view.scale>0.5){
- view.scale -= 0.1;
- }
- view.invalidate();
- }
- });
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- public class MyView extends View {
- //初始图片资源
- public Bitmap bitmap;
- //Matrix实例
- public Matrix matrix = new Matrix();
- //设置倾斜度
- public float sx = 0.0f;
- //位图的宽和高
- public int width,height;
- //缩放比例
- public float scale = 1.0f;
- //判断是旋转还是缩放
- public boolean isScale = false;
- public MyView(Context context) {
- super(context);
- //获得位图
- bitmap = ((BitmapDrawable)context.getResources().getDrawable(R.drawable.a)).getBitmap();
- //获取位图宽、高
- width = bitmap.getWidth();
- height = bitmap.getHeight();
- //是当前视图获取焦点
- this.setFocusable(true);
- }
- /**
- * 绘制图片
- */
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- //重置matrix
- matrix.reset();
- if(!isScale){
- //旋转Matrix
- matrix.setSkew(sx, 0);
- }
- else{
- //缩放Matrix
- matrix.setScale(scale, scale);
- }
- //根据院士为图和Matrix创建新图片
- Bitmap bitmap_2 = Bitmap.createBitmap(bitmap, 0, 0, width, height,matrix,true);
- //重新绘制位图
- canvas.drawBitmap(bitmap_2, matrix, null);
- }
- }
- }