原贴链接:http://www.j2medev.com/bbs/dispbbs.asp?BoardID=19&ID=34799&replyID=&skin=1
目标效果图:
我的实现思路:
由于J2ME中无法setClip()为圆形,我们可以通过蒙板来实现。即填充一个纯色的圆形,然后通过遍历其像素并从原图相应位置提取像素,生成目标图形。
代码实现:
public class MyCanvas extends Canvas implements Runnable{
static final int FPS = 15;
static int screenW;
static int screenH;
static int midX;
static int midY;
private Image markImg;
private Graphics bg;
private Image backgroundImg;
private int x, y, r;
private final static int msp = 1; // 扩大速度
public MyCanvas(){
setFullScreenMode(true);
screenW = getWidth();
screenH = getHeight();
midX = screenW>>1;
midY = screenH>>1;
init();
statr();
}
private void statr() {
(new Thread(this)).start();
}
private void init() {
try {
backgroundImg = Image.createImage("/arc.png");
} catch (IOException e) {
e.printStackTrace();
}
x = midX;
y = midY;
r = 1;
}
protected void paint(Graphics g) {
// 清屏
g.setColor(0xffffff);
g.setClip(0, 0, screenW, screenH);
g.fillRect(0, 0, screenW, screenH);
// 背景底图
if(backgroundImg!=null)
g.drawImage(backgroundImg, midX, midY, Graphics.VCENTER|Graphics.HCENTER);
// 遮罩图层
if(markImg!=null)
g.drawImage(markImg, 0, 0, 20);
}
public void run() {
while(true){
long lastTime = System.currentTimeMillis();
update();
repaint();
serviceRepaints();
long takenTime = System.currentTimeMillis()-lastTime;
try {
if(takenTime<1000/FPS){
Thread.sleep(1000/FPS-takenTime);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void update(){
// 创建遮罩图
markImg = Image.createImage(screenW, screenH);
bg = markImg.getGraphics();
// 填充为白色
bg.setColor(0xffffff);
bg.fillRect(0, 0, screenW, screenH);
// 绘制一个绿色的圆(只要颜色能与背景有区别)
bg.setColor(0x00ff00);
bg.fillArc(x-r, y-r, r*2, r*2, 0, 360);
// 图片换色
markImg = changeColor(markImg, 0x00ff00, 0x00ffffff);
// 改变增量
r += msp;
if(r>(Math.max(screenW, screenH)>>1))
r = 1;
}
/**图片换色*/
private Image changeColor(Image img, int oldcolor, int newcolor){
int imgW = img.getWidth();
int imgH = img.getHeight();
int[] RGB = new int[imgW*imgH];
img.getRGB(RGB, 0, imgW, 0, 0, imgW, imgH);
// 需要改变的颜色
int oA = (oldcolor&0xff000000)>>24;
int oR = (oldcolor&0x00ff0000)>>16;
int oG = (oldcolor&0x0000ff00)>>8;
int oB = (oldcolor&0x000000ff);
// 目标颜色
int nA = (newcolor&0xff000000)>>24;
int nR = (newcolor&0x00ff0000)>>16;
int nG = (newcolor&0x0000ff00)>>8;
int nB = (newcolor&0x000000ff);
int size = RGB.length;
for(int i=size-1; i>=0; i--){
int A = (RGB[i]&0xff000000)>>24;
int R = (RGB[i]&0x00ff0000)>>16;
int G = (RGB[i]&0x0000ff00)>>8;
int B = (RGB[i]&0x000000ff);
if(A==oA&&R==oR&&G==oG&&B==oB){
RGB[i] = ((nA<<24)&0xff)|((nR<<16)&0xff)|((nG<<8)&0xff)|(nB&0xff);
}
}
img = Image.createRGBImage(RGB, imgW, imgH, true);
return img;
}
}
分享到:
相关推荐
J2ME开发环境达建................................................................................................................2 Eclipse快速上手指南.....................................................
本书介绍了J2ME游戏开发基础,以MIDP2为主。 http://www.j2medev.com/ebook/j2me/200605/710.html<br/>http://www.j2medev.com/ebook/UploadSoftPic/200605/20060531093745896.jpg
本手册由www.j2medev.com整理制作而成。手册中相应图片、图表、文字的版权归原作者所有。你可以分发本手册的拷贝,但请保证其内容的完整性。www.j2medev.com对于使用本手册造成的任何损失,概不负责。 本手册0.7...
J2ME开发网(www.j2medev.com)是国内发展势头很猛的J2ME技术的垂直门户。J2ME 开发网广泛的覆盖了基于CLDC的MIDP技术,并将逐步扩展到CDC方面。J2ME提供最新的 原创文章,促进开发者的技术交流;提供丰富的资源下载...
J2ME开发网(www.j2medev.com)作为一个专业社区,提供了丰富的J2ME开发资源,包括但不限于技术文档、开发指南、代码示例和论坛交流。该网站的创建者mingjava发起并组织了首次翻译工作,旨在帮助开发者更好地理解和...
但是,我遇到了一个 Git 问题,这迫使我将其移至源代码。 此外,我在使用 include 时遇到了问题。 移动中的 MEDEV 实际工作我总是忘记的有用 git 命令: git commit -m "comment on what was done" git push -u ...
不论是要维护一个应用程序或是从头开始一个设计,你都能够超越成规,大幅地简化基本结构、程序开发,最终及于程序代码。你会重新掌握一度失控的J2EE应用程序。 在《轻快的好Java》一书中,作者Bruce A. Tate与...
- **J2MEDev**(http://www.j2medev.com/bbs/index.asp): 这是一个专注于J2ME技术的论坛,为开发者提供了一个交流平台。J2ME是Java 2 Platform Micro Edition的缩写,主要应用于移动设备如手机、PDA等小型嵌入式...
程序员常去的100个网站! 1 J2me开发网 http://www.j2medev.com/bbs/index.asp 2 J2me社区 http://www.j2meforums.com/forum/
本教程由J2ME开发网(www.j2medev.com)的网友集体创作。任何人未经J2ME开发网的书 面许可,不得将本教程用于商业目的。本教程受到版权法的保护。盗用、截取教程中的文字、 图形、表格都将视为非法。如未标明,则...
本教程由J2ME开发网(www.j2medev.com)的网友集体创作。任何人未经J2ME开发网的书 面许可,不得将本教程用于商业目的。本教程受到版权法的保护。盗用、截取教程中的文字、 图形、表格都将视为非法。如未标明,则...
- **展望未来**: 尽管面临诸多挑战,J2ME依然为开发者提供了一个学习和探索移动应用开发的良好起点。 - **学习建议**: 对于初学者而言,通过本教程可以快速入门J2ME开发,并逐渐掌握其核心技术和应用场景。 #### 十...
【整合SE J2ME SDK与eclipse开发环境】 在Java ME(J2ME)开发中,集成不同的SDK和开发环境可以...这种整合简化了开发流程,提高了开发效率,对于专注于SonyEricsson设备的开发者来说,是一个非常实用的工具链配置。