Android学习之——图形图像处理(使用Matrix控制变换)(二)

 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的使用方法(步骤):

  1. 获取Matrix对象
  2. 调用Matrix的方法进行平移,缩放等。
  3. 将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的简单应用:
[java]  view plain copy print ?
  1. public class MainActivity extends Activity {  
  2.     private Button btn_left,btn_right,btn_big,btn_small;  
  3.     public MyView view;  
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         final MyView view = new MyView(this);  
  8.           
  9.         setContentView(R.layout.activity_main);  
  10.           
  11.         RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl);  
  12.         rl.addView(view);  
  13.         btn_left = (Button) findViewById(R.id.btn_left);  
  14.         btn_right = (Button) findViewById(R.id.btn_right);  
  15.         btn_big = (Button) findViewById(R.id.btn_big);  
  16.         btn_small = (Button) findViewById(R.id.btn_small);  
  17.           
  18.         btn_left.setOnClickListener(new OnClickListener() {  
  19.             //这里写的有点麻烦。。。  
  20.             @Override  
  21.             public void onClick(View v) {  
  22.                 view.isScale = false;  
  23.                 view.sx += 0.1;  
  24.                 view.invalidate();  
  25.             }  
  26.         });  
  27.         btn_right.setOnClickListener(new OnClickListener() {  
  28.               
  29.             @Override  
  30.             public void onClick(View v) {  
  31.                 view.isScale = false;  
  32.                 view.sx -= 0.1;  
  33.                 view.invalidate();  
  34.             }  
  35.         });  
  36.         btn_big.setOnClickListener(new OnClickListener() {  
  37.               
  38.             @Override  
  39.             public void onClick(View v) {  
  40.                 view.isScale = true;  
  41.                 if(view.scale<2.0){  
  42.                     view.scale += 0.1;  
  43.                 }  
  44.                 view.invalidate();  
  45.             }  
  46.         });  
  47.         btn_small.setOnClickListener(new OnClickListener() {  
  48.               
  49.             @Override  
  50.             public void onClick(View v) {  
  51.                 view.isScale = true;  
  52.                 if(view.scale>0.5){  
  53.                     view.scale -= 0.1;  
  54.                 }  
  55.                 view.invalidate();  
  56.             }  
  57.         });  
  58.           
  59.     }  
  60.   
  61.     @Override  
  62.     public boolean onCreateOptionsMenu(Menu menu) {  
  63.         // Inflate the menu; this adds items to the action bar if it is present.  
  64.         getMenuInflater().inflate(R.menu.main, menu);  
  65.         return true;  
  66.     }  
  67.       
  68.     public class MyView extends View {  
  69.         //初始图片资源  
  70.         public Bitmap bitmap;  
  71.           
  72.         //Matrix实例  
  73.         public Matrix matrix = new Matrix();  
  74.           
  75.         //设置倾斜度  
  76.         public float sx = 0.0f;  
  77.           
  78.         //位图的宽和高  
  79.         public int width,height;  
  80.           
  81.         //缩放比例  
  82.         public float scale = 1.0f;  
  83.           
  84.         //判断是旋转还是缩放  
  85.         public boolean isScale = false;  
  86.           
  87.         public MyView(Context context) {  
  88.             super(context);  
  89.             //获得位图  
  90.             bitmap = ((BitmapDrawable)context.getResources().getDrawable(R.drawable.a)).getBitmap();  
  91.               
  92.             //获取位图宽、高  
  93.             width = bitmap.getWidth();  
  94.             height = bitmap.getHeight();  
  95.               
  96.             //是当前视图获取焦点  
  97.             this.setFocusable(true);  
  98.         }  
  99.         /** 
  100.          * 绘制图片 
  101.          */  
  102.         @Override  
  103.         protected void onDraw(Canvas canvas) {  
  104.             super.onDraw(canvas);  
  105.             //重置matrix  
  106.             matrix.reset();  
  107.             if(!isScale){  
  108.                 //旋转Matrix  
  109.                 matrix.setSkew(sx, 0);  
  110.             }  
  111.             else{  
  112.                 //缩放Matrix  
  113.                 matrix.setScale(scale, scale);  
  114.             }  
  115.             //根据院士为图和Matrix创建新图片  
  116.             Bitmap bitmap_2 = Bitmap.createBitmap(bitmap, 00, width, height,matrix,true);  
  117.               
  118.             //重新绘制位图  
  119.             canvas.drawBitmap(bitmap_2, matrix, null);  
  120.               
  121.               
  122.               
  123.         }  
  124.   
  125.     }  
  126. }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值