利用Android的Matrix类实现J2ME的drawRegion的镜像方法
2011-04-13 17:30
627 查看
在用Android实现J2ME的drawRegion方法时,发现网上介绍的镜像翻转都是用像素数组行变列实现的,其实这还是j2me式的实现方法,Android中有Matrix类,如果学过计算机图形学,只要按其原理,进行矩阵变换即可。
一、对称变换
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/27/4a76d96262580a4c44cc37f1466ae230.jpg)
1. 对称于Y轴
其变换矩阵:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/27/13743821c620e6a7114691268bfee9ff.jpg)
其变换为:
![](http://dl.javaeye.com/upload/picture/pic/58954/68f9387e-6ae4-363b-8296-48131ec395a8.jpg)
2. 对称于X轴:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/27/6391e00041c26352db4fead814705e7c.jpg)
3. 对称于原点O:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/27/9e120339fe684447da85a330beed7f2b.jpg)
4. 对称于直线y=x:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/27/b4b7905a0d9b298b797d2bae36efbe74.jpg)
5. 对称于直线y=-x:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/27/744b1a36fa040967dc3428a74d2abaae.jpg)
二、drawRegion方法的实现
Ruby代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/27/c0b6f79543bfa5fd0f94e5fc58f3fe51.png)
public void drawRegion(Image image_src,
int x_src, int y_src,
int width, int height,
int transform,
int x_dest, int y_dest,
int anchor){
if((anchor&VCENTER) != 0){
y_dest -= height/2;
}else if((anchor&BOTTOM) != 0){
y_dest -= height;
}
if((anchor&RIGHT) != 0){
x_dest -= width;
}else if((anchor&HCENTER) != 0){
x_dest -= width/2;
}
Bitmap newMap = Bitmap.createBitmap(image_src.getBitmap(), x_src, y_src, width, height);
Matrix mMatrix = new Matrix();
Matrix temp = new Matrix();
Matrix temp2 = new Matrix();
float[] mirrorY = {
-1, 0, 0,
0, 1, 0,
0, 0, 1
};
temp.setValues(mirrorY);
switch(transform){
case Sprite.TRANS_NONE:
break;
case Sprite.TRANS_ROT90:
mMatrix.setRotate(90,width/2, height/2);
break;
case Sprite.TRANS_ROT180:
mMatrix.setRotate(180,width/2, height/2);
break;
case Sprite.TRANS_ROT270:
mMatrix.setRotate(270,width/2, height/2);
break;
case Sprite.TRANS_MIRROR:
mMatrix.postConcat(temp);
break;
case Sprite.TRANS_MIRROR_ROT90:
mMatrix.postConcat(temp);
mMatrix.setRotate(90,width/2, height/2);
break;
case Sprite.TRANS_MIRROR_ROT180:
mMatrix.postConcat(temp);
mMatrix.setRotate(180,width/2, height/2);
break;
case Sprite.TRANS_MIRROR_ROT270:
mMatrix.postConcat(temp);
mMatrix.setRotate(270,width/2, height/2);
break;
}
mMatrix.setTranslate(x_dest, y_dest);
canvas.drawBitmap(newMap, mMatrix, mPaint);
}
利用Matrix类,不止可实现对称变换,还可以实现其它的几何变换,包括组合变换。附件中是从网上找到的关于图形变换原理的ppt,希望对大家有帮助。
一、对称变换
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/27/4a76d96262580a4c44cc37f1466ae230.jpg)
1. 对称于Y轴
其变换矩阵:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/27/13743821c620e6a7114691268bfee9ff.jpg)
其变换为:
![](http://dl.javaeye.com/upload/picture/pic/58954/68f9387e-6ae4-363b-8296-48131ec395a8.jpg)
2. 对称于X轴:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/27/6391e00041c26352db4fead814705e7c.jpg)
3. 对称于原点O:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/27/9e120339fe684447da85a330beed7f2b.jpg)
4. 对称于直线y=x:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/27/b4b7905a0d9b298b797d2bae36efbe74.jpg)
5. 对称于直线y=-x:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/27/744b1a36fa040967dc3428a74d2abaae.jpg)
二、drawRegion方法的实现
Ruby代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/27/c0b6f79543bfa5fd0f94e5fc58f3fe51.png)
public void drawRegion(Image image_src,
int x_src, int y_src,
int width, int height,
int transform,
int x_dest, int y_dest,
int anchor){
if((anchor&VCENTER) != 0){
y_dest -= height/2;
}else if((anchor&BOTTOM) != 0){
y_dest -= height;
}
if((anchor&RIGHT) != 0){
x_dest -= width;
}else if((anchor&HCENTER) != 0){
x_dest -= width/2;
}
Bitmap newMap = Bitmap.createBitmap(image_src.getBitmap(), x_src, y_src, width, height);
Matrix mMatrix = new Matrix();
Matrix temp = new Matrix();
Matrix temp2 = new Matrix();
float[] mirrorY = {
-1, 0, 0,
0, 1, 0,
0, 0, 1
};
temp.setValues(mirrorY);
switch(transform){
case Sprite.TRANS_NONE:
break;
case Sprite.TRANS_ROT90:
mMatrix.setRotate(90,width/2, height/2);
break;
case Sprite.TRANS_ROT180:
mMatrix.setRotate(180,width/2, height/2);
break;
case Sprite.TRANS_ROT270:
mMatrix.setRotate(270,width/2, height/2);
break;
case Sprite.TRANS_MIRROR:
mMatrix.postConcat(temp);
break;
case Sprite.TRANS_MIRROR_ROT90:
mMatrix.postConcat(temp);
mMatrix.setRotate(90,width/2, height/2);
break;
case Sprite.TRANS_MIRROR_ROT180:
mMatrix.postConcat(temp);
mMatrix.setRotate(180,width/2, height/2);
break;
case Sprite.TRANS_MIRROR_ROT270:
mMatrix.postConcat(temp);
mMatrix.setRotate(270,width/2, height/2);
break;
}
mMatrix.setTranslate(x_dest, y_dest);
canvas.drawBitmap(newMap, mMatrix, mPaint);
}
利用Matrix类,不止可实现对称变换,还可以实现其它的几何变换,包括组合变换。附件中是从网上找到的关于图形变换原理的ppt,希望对大家有帮助。
相关文章推荐
- 【转】Android Matrix类实现J2ME的drawRegion的镜像方法【新一则】
- Android Matrix类实现J2ME的drawRegion的镜像方法
- Android 利用Gallry实现图片轮播(方法已经被淘汰.不过好用)..可实现无线循环轮播
- Android中Xposed框架篇---利用Xposed框架实现拦截系统方法
- Android Matrix利用invert实现逆向坐标映射
- android利用Http协议实现从网络上面获取图片的方法
- Android中利用Xposed框架实现拦截系统方法
- Android中Xposed框架篇---利用Xposed框架实现拦截系统方法
- Android:利用Matrix,实现双手指缩放图片与拖拽图片功能
- Android开发之利用Intent实现数据传递的方法
- android利用httpclient实现post、get请求restful接口进行json和form表单数据提交等公共方法类
- Android 保存图片到系统图库 -- 利用 “系统保存屏幕截图” 的方法实现
- 【Android开发经验】利用反射机制,获取类的字段、方法、并实现简单调用
- [转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法
- Android中利用Camera与Matrix实现3D效果详解
- Android 利用Matrix实现图片随手指平移、旋转、缩放
- Android中利用Camera与Matrix实现3D效果详解
- Android中利用Matrix实现图片平移、缩放和旋转
- Android中利用C++处理Bitmap对象的实现方法
- android利用Context提供的方法实现java映射