本文主要介绍了矩阵在Android中的用法,并以实例的形式分析了矩阵矩阵运算的常用技巧,具有一定的参考价值,有需要的朋友可以参考一下。
本文举例说明了Matrix在Android中的用法。分享给你,供你参考,如下:
矩阵,中文叫矩阵,是高等数学中引入的。在图像处理中,主要用于平面的缩放、平移、旋转等操作。
首先介绍一下矩阵运算。加减法就不用说了,把相应的位相加就行了。图像处理主要用乘法。下面是一个乘法公式:
在Android中,Matrix由9个浮点值组成,是一个3*3的矩阵。如下图:
说明上面的sinX和cosX表示旋转角度的cos和sin值。请注意,旋转角度是顺时针计算的。TranslateX和translateY表示x和y的平移量。Scale是缩放比例,1是常数,2是1/2缩放。
矩阵操作分为四种:平移(translate)、旋转(rotate)、缩放(zoom)和倾斜(tilt)。每个转换都提供了Android API中的set、post、pre三种操作模式。除了平移,其他三个操作都可以指定中心点。
Set是直接设置矩阵的值。每设置一次,整个矩阵的数组都会发生变化。
是后乘法,当前矩阵乘以参数给定的矩阵。您可以连续多次使用post来完成所需的整个转换。比如把一张图片旋转30度,然后平移到(100,100)的地方,可以这样做:Matrix m=new Matrix();m . post rotate(30);m.postTranslate(100,100);这达到了预期的效果。
Pre是预乘,参数给定的矩阵乘以当前矩阵。所以操作发生在当前矩阵的前面。比如上面的例子,如果用pre,会是这样的:Matrix m=new Matrix();m.setTranslate(100,100);m . pre rotate(30);
旋转、缩放和倾斜都可以围绕一个中心点进行。如果没有指定,默认情况下,它是围绕(0,0)点完成的。
特别注意:
矩阵操作分为四种:平移(translate)、旋转(rotate)、缩放(zoom)和倾斜(tilt)。每个转换都提供了Android API中的set、post、pre三种操作模式。除了平移,其他三个操作都可以指定中心点。
Set是直接设置矩阵的值。每设置一次,整个矩阵的数组都会发生变化。
是后乘法,当前矩阵乘以参数给定的矩阵。您可以连续多次使用post来完成所需的整个转换。
镜像效果:
反射效果:
图片组成(水印):
不多说,直接去码。
MainActivity.java的主要法规如下:
包net . loonggg . test matrix;
导入Android . app . activity;
导入Android . graphics . bitmap;
导入Android . graphics . bitmapfactory;
导入Android . graphics . canvas;
导入Android . graphics . color;
导入Android . graphics . matrix;
导入Android . graphics . paint;
导入Android . graphics . porter duff . mode;
导入Android . graphics . porterduffxfermode;
导入Android . OS . bundle;
导入Android . view . window;
导入Android . widget . imageview;
公共类MainActivity扩展Activity {
私有ImageView iv1、iv2
私人帆布画布;
私漆油漆;
@覆盖
受保护的void onCreate(Bundle saved instancestate){
super . oncreate(savedInstanceState);
requestWindowFeature(窗口。特征_编号_标题);
setContentView(r . layout . activity _ main);
iv1=(ImageView)findViewById(r . id . iv1);
iv2=(ImageView)findViewById(r . id . iv2);
bitmap bitmap 1=bitmap factory . decode resource(get resources(),
r . draw able . Weibo);
bitmap update bitmap=bitmap . create bitmap(bitmap 1 . getwidth()* 2,
bitmap1.getHeight() * 2,bitmap 1 . getconfig());
Canvas=new Canvas(update bitmap);
Paint=new Paint();
paint.setColor(颜色。黑色);
Matrix Matrix=new Matrix();
//setMirrorOne(bitmap1,matrix);
//setInvertedImage(bitmap1,matrix);
//setbase change(矩阵);
canvas.drawBitmap(bitmap1,matrix,paint);
setImageSynthesis(矩阵);
iv1.setImageBitmap(位图1);
iv2。setimagebitmap(更新位图);
}
/**
* 还有一些基本变化
*/
私有无效集合基础更改(矩阵矩阵){
//矩阵。设置旋转(60);//这是旋转多少度
//matrix.setRotate(degrees,px,py);//这个方法是以哪个点为中心进行旋转多少度
//matrix.setSkew(kx,ky);//设置倾斜,以x轴倾斜,还是y轴
//倾斜x和y轴,以(100,100)为中心。
//matrix.postSkew(0 .2f,0 .2f,100,100);
//matrix.setScale(0.5f,1);//缩放宽度变为原来的一半,高度不变
}
/**
* 设置倒影效果
*
* @param位图一
* @param矩阵
*/
私有void setInvertedImage(位图位图1,矩阵矩阵){
matrix.setScale(1,-1);
matrix.postTranslate(0,位图1。getheight());
}
/**
* 设置镜面效果方法一
*
* @param位图一
* @param矩阵
*/
私有void setMirrorOne(位图位图1,矩阵矩阵){
矩阵。设置平移(位图1。getwidth(),0);//这个是移动
matrix.preScale(-1,1);
}
//-
/**
* 解释:镜面效果方法一和二的区别:
* 不知道大家看没看出来,其实这两种方法的效果是一样的,只不过是设置步骤不一样,发布是后乘,当前的矩阵乘以参数给出的矩阵
* 。可以连续多次使用帖子,来完成所需的整个变换2007年前是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。
* 可以连续多次使用邮政
* ,来完成所需的整个变换,但是不可以连续使用设置来完成矩阵的整个变换,为什么呢?设置是直接设置[数]矩阵的值,每次设置一次
* ,整个[数]矩阵的数组都会变掉,第一次可以使用设置,之后的变换必须换成邮政或者pre,也可以一直用邮政也行
*/
//-
/**
* 设置镜面效果方法二
*
* @param位图一
* @param矩阵
*/
私有void setMirrorTwo(位图位图1,矩阵矩阵){
matrix.setScale(-1,1);
矩阵。翻译后(位图1。getwidth(),0);
}
/**
* 设置图片的合成
*
* @param矩阵
*/
私有空集图像合成(Matrix Matrix){
位图位图2=位图工厂。解码资源(获取资源(),
r。可画的。IC _ launcher);
//设置图片合成时的各种模式
paint.setXfermode(新PorterDuffXfermode(模式。变暗));
//图片的合成很简单,就是再以位图2为基图往目标图片上画一次
canvas.drawBitmap(bitmap2,matrix,paint);
}
}
布局文件的代码如下:
线性布局xmlns:Android=' http://模式。安卓。' com/apk/RES/Android '
xmlns:tools=' http://模式。安卓。' com/tools '
Android:layout _ width=' match _ parent '
Android:layout _ height=' match _ parent '
安卓:方向='垂直'
工具:上下文='。'主要活动'
图像视图
android:id='@ id/iv1 '
Android:layout _ width=' wrap _ content '
Android:layout _ height=' wrap _ content '/
图像视图
android:id='@ id/iv2 '
Android:layout _ width=' wrap _ content '
Android:layout _ height=' wrap _ content '/
/线性布局
希望本文所述对大家机器人程序设计有所帮助。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。