Android基础笔记整理:多媒体技术—10.3 Matrix矩阵

 

目录

一、Matrix简单介绍

提示:本部分只是对Matrix进行基本介绍。

Matrix类的常用方法

Matrix矩阵理论讲解

提示:关于三角函数的数学计算。

二、案例代码实现

方式1:Matrix基本操作_setValues

【例10-7】使用Matrix进行图形的改变

【例10-8】在布局管理器中定义组件——main.xml

方式2:Matrix类的特有方法操作【推荐】

【例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类中也同样提供了 sincos的计算方法,这样可以为开发带来更多的方便。

下面的程序将完成此操作。

 

二、案例代码实现

如果一张图片希望可以在指定的坐标点 (假设坐标为(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类中提供的方法实现。

        

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被开发耽误的大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值