本文将讲述如何如何在Android中使用Matrix实现图片的缩放和旋转,通过本文学习,你将学会如何通过Matrix操作图像。
代码示例: 直接上代码了,我在代码中附带了详细的解释,代码如下: package com.eoeandroid.demo.testcode; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.view.ViewGroup.LayoutParams; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ImageView.ScaleType; public class bitmaptest extends Activity { public void onCreate(Bundle icicle) { super.onCreate(icicle); setTitle("eoeAndroid教程: 缩放和旋转图片 -by:IceskYsl"); LinearLayout linLayout = new LinearLayout(this); // 加载需要操作的图片,这里是eoeAndroid的logo图片 Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(), R.drawable.eoe_android); //获取这个图片的宽和高 int width = bitmapOrg.getWidth(); int height = bitmapOrg.getHeight(); //定义预转换成的图片的宽度和高度 int newWidth = 200; int newHeight = 200; //计算缩放率,新尺寸除原始尺寸 float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // 创建操作图片用的matrix对象 Matrix matrix = new Matrix(); // 缩放图片动作 matrix.postScale(scaleWidth, scaleHeight); //旋转图片 动作 matrix.postRotate(45); // 创建新的图片 Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, width, height, matrix, true); //将上面创建的Bitmap转换成Drawable对象,使得其可以使用在ImageView, ImageButton中 BitmapDrawable bmd = new BitmapDrawable(resizedBitmap); //创建一个ImageView ImageView imageView = new ImageView(this); // 设置ImageView的图片为上面转换的图片 imageView.setImageDrawable(bmd); //将图片居中显示 imageView.setScaleType(ScaleType.CENTER); //将ImageView添加到布局模板中 linLayout.addView(imageView, new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT ) ); // 设置为本activity的模板 setContentView(linLayout); } } 复制代码 这里没用定义XML布局模板,而是直接在代码中生成了需要的模板和视图组件,你可以可以定义XML模板,其他原理是一样的。 在游戏开发中,自定义View是一个相当重要的功能,下面先讲一讲在View上绘制所需的四个基本主键: Bitmap:用于容纳像素点(android.graphics.Bitmap) Canvas:负责调用绘制方法,是整个过程的入口 要绘制的对象:比如绘制一个Bitmap,矩形或者圆 Paint: 设置绘制图形的颜色和样式 Matrix:它包含一个3x3的矩阵,用于做变换匹配(图像处理中有讲),Matrix没有一个结构体,它必须被初始化,通过实现reset()方法或者set..()方法来实现。 下面来看代码: import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.os.Bundle; import android.view.View; import android.graphics.Bitmap; import android.graphics.BitmapFactory; //import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Canvas; import android.graphics.Paint; //import android.graphics.Rect; public class TestMartix extends Activity { //新建Bitmap,Canvas和Paint private Bitmap img,r_img; private Canvas canvas; private Paint paint; //由于是自定义view,所以不需要调用Layout文件 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //调用自定义View setContentView(new MyView(this)); } public class MyView extends View{ //View的初始化 public MyView(Context context) { super(context); //BitmapFactory:从源创建一个Bitmap对象,这些源包括:文件,流或者数组 img = BitmapFactory.decodeResource(getResources(),R.drawable.img); //新建一个Matrix对象 Matrix matrix = new Matrix(); //让矩阵实现翻转,参数为FLOAT型 matrix.postRotate(90); //matrix.postRotate(0); //获取Bitmap的高与宽 int width = img.getWidth(); int height = img.getHeight(); //源Bitmap通过一个Matrix变化后,返回一个不可变的Bitmap b_img = Bitmap.createBitmap(img, 0, 0, width, height, matrix, true); paint = new Paint(); } //在自定义VIEW时,必须实现此方法 public void onDraw(Canvas canvas){ //在重写父类的方法时,必须先调用父类的方法 super.onDraw(canvas); //利用Canvas在View上绘制一个Bitmap,并设置它的样式和颜色 canvas.drawBitmap(b_img, 10, 10, paint); //该方法是用来更新View的方法,多与线程结合使用。 //this.invalidate () //下面三段代码用于在View上绘制一个实心矩形,设置颜色为绿色, //paint.setColor(Color.GREEN); //paint.setAntiAlias(true); //canvas.drawRect(new Rect(30,30,100,100), paint); } } } |
|