先说说drawRegion方法:
public void drawRegion(Image src,//图像文件
int x_src,//图像的起始点X坐标
int y_src,//图像的起始点Y坐标
int width,//要画图像的宽度
int height,//要画图像的高度
int transform,//旋转参数
int x_dest,//目标X坐标(也就是你要把图像画到那个Canvas上的哪个位置)
int y_dest,//目标Y坐标
int anchor)//锚点
简单的说就是从原图截取一块内容并且可以旋转画在指定的位置。
从网上找了一个方法用matrix实现了,具体代码如下:
http://novembre.iteye.com/blog/636175 写道
在用Android实现J2ME的drawRegion方法时,发现网上介绍的镜像翻转都是用像素数组行变列实现的,其实这还是j2me式的实现方法,Android中有Matrix类,如果学过计算机图形学,只要按其原理,进行矩阵变换即可。
一、对称变换
1. 对称于Y轴
其变换矩阵:
其变换为:
2. 对称于X轴:
3. 对称于原点O:
4. 对称于直线y=x:
5. 对称于直线y=-x:
二、drawRegion方法的实现
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上实现drawRegion方法,我在做一个动画使用到了动画编辑器spritex,所以必须使用这个编辑器提供的类SpriteX.java,这个类只使用了j2me中的canvas里的基本绘图函数(当然也包括了drawRegion),所以只要你实现了j2me的canvas方法就可以用SpriteX.java,SpriteX.java的paint方法中使用了drawRegion所以我们也必须要实现它。
现在在说说我发现的问题那就是我上面找到的实现方法是使用“Bitmap newMap = Bitmap.createBitmap(image_src.getBitmap(), x_src, y_src, width, height);”来截取一块图像。它create了一个张图片。在android中每次创建图片系统都会GC一次!
现在问题出来了 我的程序移植在刷新--》SpriteX.java的paint方法每次都调用drawRegion--》drawRegion方法每次都createBitmap--》系统每次都GC
这样下去程序肯定会完蛋的,所以我修改了这个类,使用另一种方式来实现了它,没有create。
说明写在程序中了
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.getImage(), x_src, y_src,width, height);
/*
* 这里没有使用create 而是用canvas的clipRect方法来实现扣图的效果
* 使用了save为后面恢复剪裁区用
*/
g.save();
g.clipRect(x_dest, y_dest, x_dest+width, y_dest+height);
Matrix mMatrix = new Matrix();
Matrix temp = new Matrix();
float[] mirrorY = { -1, 0, 0, 0, 1, 0, 0, 0, 1 };
temp.setValues(mirrorY);
switch (transform) {
case SpriteX.TRANS_NONE:
break;
case SpriteX.TRANS_ROT90:
mMatrix.setRotate(90, width / 2, height / 2);
break;
case SpriteX.TRANS_ROT180:
mMatrix.setRotate(180, width / 2, height / 2);
break;
case SpriteX.TRANS_ROT270:
mMatrix.setRotate(270, width / 2, height / 2);
break;
case SpriteX.TRANS_MIRROR:
mMatrix.postConcat(temp);
break;
case SpriteX.TRANS_MIRROR_ROT90:
mMatrix.postConcat(temp);
mMatrix.setRotate(90, width / 2, height / 2);
break;
case SpriteX.TRANS_MIRROR_ROT180:
mMatrix.postConcat(temp);
mMatrix.setRotate(180, width / 2, height / 2);
break;
case SpriteX.TRANS_MIRROR_ROT270:
mMatrix.postConcat(temp);
mMatrix.setRotate(270, width / 2, height / 2);
break;
}
/*
* 这里的偏移要注意减去x_src和y_src
* 并且调用restore()恢复剪裁区
*/
mMatrix.setTranslate(x_dest-x_src, y_dest-y_src);
g.drawBitmap(image_src.getImage(), mMatrix, p);
g.restore();
}
分享到:
相关推荐
这篇博文"利用Android的Matrix类实现J2ME的drawRegion的镜像方法"探讨了如何在Android环境中复现J2ME的`drawRegion`功能,该功能通常用于在画布上绘制图像的特定区域并支持各种效果,如翻转(镜像)。 在J2ME中,`...
通过分析这些源代码,开发者可以了解J2ME-Loader的内部实现机制,学习如何在Android上实现J2ME应用的模拟,甚至可以根据自己的需求进行二次开发。 总的来说,J2ME-Loader为Android用户打开了通向过去的大门,让他们...
J2ME是Java平台的一个子集,主要用于移动设备和嵌入式系统,而Android则是一个开源的操作系统,主要应用于智能手机和平板电脑。在移动开发领域,随着Android的普及,很多J2ME开发者有需求将已有的J2ME应用移植到...
例如,J2ME的Canvas可能需要转换为Android的SurfaceView,而音效和音乐播放则可能需要使用Android的MediaPlayer或OpenSL ES。 4. **事件处理**:Android的事件模型与J2ME的事件模型不同,开发者需要将J2ME的事件...
【标题】"Android-development.rar" 是一个针对Android游戏开发的压缩包资源,它特别强调了在Android平台上构建游戏的快速方法。"android_game android J2ME site:en.pudn.c"这部分标签揭示了该资源可能包含的内容,...
创建自定义的View类,继承自SurfaceView,并重写onDraw()方法,就可以在Android上实现Layer的功能,用于绘制游戏的各个组件。 **LayerManager** 类则负责管理多个Layer,它负责控制这些Layer的显示顺序、更新和绘制...
移植时,我们需要创建一个`AndroidGraphics`类,它继承自J2ME的`Graphics`,并重写其方法,将绘图操作转发给`Canvas`。例如,`drawString()`可以对应到`Canvas.drawText()`,`drawRect()`对应`Canvas.drawRect()`。 ...
Android下实现的J2ME API类库,使用此SDK可以无缝将你J2ME APP移植成android APP, 支持MIDP2.0、cldc1.0,WMA,jsr75等常用API 20111204更新新版: 1 JAD.MF文件:增加屏幕方向设置 2 JAD.MF文件:增加游戏专用摇杆...
至于旋转,J2ME通常使用drawRegion或drawImage配合旋转角度,而Android可以创建一个新的Bitmap进行翻转后再绘制,或者使用Matrix进行更复杂的图像变换。 综上所述,J2ME和Android在开发环境、工程组织、代码结构...
本API库完全支持 支持MIDP2.0、cldc1.0,WMA,jsr75等常用API库,借助它你可以非常快速地将原J2ME应用转化为APK应用 包括: 1 案例程序源码及工程导入Eclipse即可使用 ; 2 工具包android_midp.jar ; 3 简要开发指南...
本API库完全支持 支持MIDP2.0、cldc1.0,WMA,jsr75等常用API库,借助它你可以非常快速地将原J2ME应用转化为APK应用 包括: 1 案例程序源码及工程导入Eclipse即可使用 2 工具包android_midp.jar 3 简要开发指南dev...
总的来说,J2MEBuilder提供了一种快速将J2ME应用转换为Android APK的方法,降低了迁移成本,使得开发者可以充分利用J2ME的已有资源,为Android用户提供服务。然而,开发者仍需对J2ME和Android平台的差异有所了解,...
通过学习这个教程和参考提供的项目,你可以深入理解J2ME中Pak文件的创建和使用方法,这对于开发高效、轻量级的移动应用非常有帮助。记得在实际操作时,遵循良好的编程实践,如资源的正确管理,防止内存泄漏,以及...
2. **UI适配**:J2ME的用户界面组件与Android的视图组件不同,可能需要重新设计和实现UI以适应Android的Material Design原则。 3. **性能优化**:考虑到Android设备的硬件性能普遍优于J2ME的目标设备,移植时应考虑...
然而,随着智能手机的普及,Android成为了主流的操作系统,许多开发者和用户开始寻找将J2ME应用移植到Android平台的方法。本文将详细介绍J2ME应用移植到Android的步骤、挑战以及解决方案。 首先,理解两者之间的...
- **图像处理**:J2ME使用Image类,Android则使用Bitmap类和BitmapFactory来加载和操作图片。 - **绘图**:J2ME的Graphics类与Android的Canvas类类似,但Android提供了更丰富的绘图API,如Paint类。 - **事件处理...
通过对比分析Android与J2ME平台的特点,并结合XMPP协议的优势,本文提出了一种实现Android与J2ME平台间即时通信的方法。该方法不仅满足了不同智能手机平台间的通信需求,而且具有较好的兼容性和可扩展性。未来,随着...
其中,“android_jbox2d.jar”是用于实现物理模拟的重要库,而其他文件则提供了不同方面的学习材料。 首先,JBox2D是一个基于Java的物理引擎,被广泛用于创建2D物理效果,如重力、碰撞检测和刚体动力学。"jbox2d....
Android平台上的J2ME加载器是一款特殊的软件,它允许用户在Android设备上运行基于Java ME(J2ME)开发的游戏和应用程序。Java ME是Java的一个轻量级版本,主要用于移动设备和嵌入式系统,因此许多早期的移动游戏都是...