目录
【例10-9】修改MyView程序,通过Matrix类提供的方法进行图片的操作
一、Matrix简单介绍
使用Bitmap可以进行图形的绘制,但是如果希望图形可以进行一些平移、旋转、缩放、倾斜 等变换,则需要android.graphics.Matrix (矩阵)类的支持,Matrix类中定义的常用方法如表10-7 所示。
提示:本部分只是对Matrix进行基本介绍。
由于Matrix涉及许多图片的效果操作,而且还需要大量的数学计算公式,考虑到本书的 定位并不属于纯粹的多媒体或游戏开发,所以本书对Matrix只进行基本的概念讲解,而具体的数学计算公式的推导,有兴趣的读者可以查阅相关资料进行学习。
Matrix类的常用方法
Matrix矩阵理论讲解
在Matrix类中最复杂的方法是setValues()方法,此方法要设置一个3X3的矩阵,其中矩阵中的每一个数字的含义如图10-6所示。
由于此矩阵要涉及一些数学上的矩阵计算,为了简化读者的思考,下面给出一个该矩阵的计算模板,如图10-7所示。
下面通过一个操作来解释图10-7所示的矩阵。例如,如果一张图片希望可以在指定的坐标点 (假设坐标为(100,200))进行旋转60°的操作,且整体收缩1/2,则使用的矩阵如图10-8所示。
提示:关于三角函数的数学计算。
在三角函数曲线中,π表示180°,所以π/3表示60°,而在Java程序中的java.lang.Math 类中提供了 一个常量PI表示π,而在Math类中也同样提供了 sin和cos的计算方法,这样可以为开发带来更多的方便。
下面的程序将完成此操作。
二、案例代码实现
如果一张图片希望可以在指定的坐标点 (假设坐标为(100,200))进行旋转60°的操作,且整体收缩1/2
方式1:Matrix基本操作_setValues
【例10-7】使用Matrix进行图形的改变
一张图片在指定的坐标点 (假设坐标为(100,200))进行旋转60°的操作,且整体收缩1/2
package org.lxh.demo;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.view.View;
/**
* 演示效果:
* 一张图片在指定的坐标点 (假设坐标为(100,200))进行旋转60°的操作,且整体收缩1/2
* @author luminal
*/
public class MyView extends View {// 继承View
private Bitmap bitmap = null ;
private Matrix matrix = new Matrix();
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
this.bitmap = BitmapFactory.decodeResource(super.getResources(),
R.drawable.android_mldn);// 取得Bitmap
float cosValue = (float) Math.cos(-Math.PI/3);// 60度
float sinValue = (float) Math.sin(-Math.PI/3);// 60度
this.matrix.setValues(new float[] {
cosValue,// X轴的缩放,1表示原始大小
-sinValue,// 旋转的X轴
100,// x轴平移
sinValue,// 旋转Y轴
cosValue,// Y轴的缩放,1表示原始大小
200,// y轴平移
0, 0,// 视角转换
2// 缩放比例,1不变,2表示1/2【即图片缩放1/2】
});
}
@Override
protected void onDraw(Canvas canvas) {// 绘图
canvas.drawBitmap(this.bitmap, this.matrix, null);// 画图
}
}
在本程序中,使用Matrix类中的setValue()方法设置了一个3X3的矩阵,矩阵的设计原则 与图10-8所示原则一致。
【例10-8】在布局管理器中定义组件——main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!-- 引入自定义组件 -->
<org.lxh.demo.MyView
android:id="@+id/myview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
本程序的运行效果如图10-9所示
以上程序可以很好地完成图像的基本变化,但是这种变化需要使用数学公式进行一些推导, 本身比较麻烦,所以Matrix为了简化开发难度,对于所有的图像变化提供了一些操作方法。
方式2:Matrix类的特有方法操作【推荐】
下面使用Matrix类的方法对图片进行同样的操作
【例10-9】修改MyView程序,通过Matrix类提供的方法进行图片的操作
package org.lxh.demo;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.view.View;
public class MyView extends View {// 继承View
private Bitmap bitmap = null ;
private Matrix matrix = new Matrix();
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
this.bitmap = BitmapFactory.decodeResource(super.getResources(),
R.drawable.android_mldn);// 取得Bitmap
this.matrix.preScale(0.5f, 0.5f, 50, 100);// 缩小一倍
this.matrix.preRotate(-60, 50, 100);// 在指定坐标翻转60度
this.matrix.preTranslate(50, 100);// 图象平移
}
@Override
protected void onDraw(Canvas canvas) {// 绘图
canvas.drawBitmap(this.bitmap, this.matrix, null);// 画图
}
}
本程序实现了与图10-9一样的操作效果,所有的操作中,不再需要使用复杂的矩阵,而直 接利用Matrix类中提供的方法实现。