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

        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的简单应用:
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);
			
			
			
		}

	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值