`
izuoyan
  • 浏览: 9220132 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

介绍MIDP2.0新特性Alpha混合

阅读更多

作者:mingjava 文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=437

在MIDP2.0中新增了Alpha混合特性,我们可以使用这个特性来对图片进行一些处理。本文将结合一个具体的例子说明一下Alpha混合。

首先我们参考一下MIDP2.0 java doc中关于Alpha Processing的说明:在可修改图片中的每个像素都必须是完全模糊的,在不可修改图片中的每个像素可以是完全透明的,完全模糊的或者介于两者之间的,也就是半透明。系统的实现必须要支持存储,处理和绘画全透明和全模糊的像素,当从数据源创建一个图片的时候(数据源可能来自PNG图片或者一个字节数组),原图片中的不透明像素和透明像素应该在新图片中保持不变。对半透明像素的处理就和系统的实现相关了,要看Alpha混合是否被支持。如果系统实现支持Alpha混合,那么原图中的半透明像素在新图片中依然保持半透明,当然数值可能会根据系统支持的半透明的级别发生一些变化。如果系统实现不支持Alpha混合的话,任何半透明的像素在新图片中应该使用全透明的像素来替换。

接下来我们熟悉几个方法,正是他们的引入增加了Alpha混合特性。
public static Image createRGBImage(int[]rgb,
intwidth,
intheight,
booleanprocessAlpha)

上面的方法来自于Image类,它允许我们从rgb数组创建一个不可修改的图片,数组中的数值形式为0xAARRGGBB,其中AA代表透明度,后面的代表颜色值。具体方法的介绍请参考MIDP Java doc。

public void getRGB(int[]rgbData,
intoffset,
intscanlength,
intx,
inty,
intwidth,
intheight)

下面的方法同样来自于Image类,这个方法可以让我们从图片的指定区域读取ARGB像素值,并存储到rgbData数组中。具体方法的介绍请参考MIDP Java doc。

public void drawRGB(int[]rgbData,
intoffset,
intscanlength,
intx,
inty,
intwidth,
intheight,
booleanprocessAlpha)

上面的方法是Graphics中新增的,使用这个方法我们可以在指定的区域绘画一些列和设备无关的(RGB+透明)值,rgbData中的元素形式为0xAARRGGBB。其中AA代表透明度,00代表全透明 ,FF代表完全模糊。具体方法的介绍请参考MIDP Java doc。

下面我们编写一个例子来介绍如何使用Alpha混合,通过实例形象的说明这一效果。我们打开一个图片,然后在图像的上面进行半透明的掩饰,制造出下面的效果,参考下图:

制作这样的效果并不难,我们只需要调用上面的drawRGB()方法即可,为了更好的掩饰这一效果。我们启动一个新的线程来不断的更新mask区域的高度,然后重新绘制屏幕(这里没有考虑优化)。代码如下:
public void paint(Graphics g) {
g.setColor(255, 255, 255);
g.fillRect(0, 0, getWidth(), getHeight());//paint Canvas background white
g.drawImage(backgroundImage, x, y, Graphics.TOP|Graphics.LEFT);

//render the semi-transparent mask
if (maskHeight != 0){
g.drawRGB(maskArray, 0, imageWidth, x, y, imageWidth, maskHeight, true);
}
}

public void run() {
for(int i = 1; i <= imageHeight; i++) {
maskHeight = i;
repaint();
try {
Thread.sleep(50);
}catch(InterruptedException ie) {}
}
}

下面给出这个应用程序的源代码,代码出自Programming Java 2 Micro Edition on Symbian OS一书。笔者只是借花献佛,因为最近论坛一直有人问Alpha相关的问题。
/*
* Copyright 2003, 2004 Symbian Ltd.
* For License terms see http://www.symbian.com/developer/techlib/codelicense.html
*/

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class AlphaBlending extends MIDlet implements CommandListener {

private Display display;
private Form form;
private Command exitCommand;
private Command startCommand;
private Command backCommand;
private AlphaCanvas alphaCanvas;

private static final String IMAGE_NAME = "/image.png";


public AlphaBlending() {
display = Display.getDisplay(this);
exitCommand = new Command("Exit", Command.EXIT, 2);
startCommand = new Command("Start", Command.SCREEN, 1);
backCommand = new Command("Back", Command.BACK, 1);
alphaCanvas = new AlphaCanvas(IMAGE_NAME);
form = new Form("Alpha Blending Demo");
form.append(new StringItem(null, "Press 'Start' to run demo."));
form.addCommand(exitCommand);
form.addCommand(startCommand);
form.setCommandListener(this);
}


public void startApp() {
display.setCurrent(form);
}


public void pauseApp() {}


public void destroyApp(boolean unconditional) {}


public void commandAction(Command c, Displayable d) {
if (c == exitCommand) {
destroyApp(false);
notifyDestroyed();
}else if (c == startCommand) {
display.setCurrent(alphaCanvas);
alphaCanvas.addCommand(backCommand);
alphaCanvas.setCommandListener(this);

Thread t = new Thread(alphaCanvas);
t.start();
}else if (c == backCommand) {

display.setCurrent(form);
}
}


}

/*
* Copyright 2003, 2004 Symbian Ltd.
* For License terms see http://www.symbian.com/developer/techlib/codelicense.html
*/

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;

public class AlphaCanvas extends Canvas implements Runnable {

private Image backgroundImage;
private int[] maskArray;
private int imageWidth;
private int imageHeight;
private int x;
private int y;
private int maskHeight = 0;

public AlphaCanvas(String imageName) {
//create the background image
try {
backgroundImage = Image.createImage(imageName);
}catch(IOException ioe) {
ioe.printStackTrace() ;
}
imageWidth = backgroundImage.getWidth();
imageHeight = backgroundImage.getHeight();

//create a semi-transparent red mask to cover the background image
maskArray = new int[imageWidth*imageHeight];
for (int i = 0; i < imageWidth*imageHeight; i++) {
maskArray[i] = 0x11FFF000;//alpha coefficient set to 0.3
}

x = (getWidth() - imageWidth)/2;
y = (getHeight() - imageHeight)/2;
}

public void paint(Graphics g) {
g.setColor(255, 255, 255);
g.fillRect(0, 0, getWidth(), getHeight());//paint Canvas background white
g.drawImage(backgroundImage, x, y, Graphics.TOP|Graphics.LEFT);

//render the semi-transparent mask
if (maskHeight != 0){
g.drawRGB(maskArray, 0, imageWidth, x, y, imageWidth, maskHeight, true);
}
}

public void run() {
for(int i = 1; i <= imageHeight; i++) {
maskHeight = i;
repaint();
try {
Thread.sleep(50);
}catch(InterruptedException ie) {}
}
}

}

从这里下载src

分享到:
评论

相关推荐

    深入剖析midp 2.0

    1. **增强的用户界面**:MIDP 2.0引入了新的用户界面组件,如列表视图、表格视图等,使得开发者能够创建更加复杂和动态的用户界面。 2. **文件系统访问**:MIDP 2.0允许应用程序直接访问设备的文件系统,这在MIDP ...

    midp2.0教程

    MIDP2.0相对于之前的版本,新增了一些重要的特性和改进,这些特性对于游戏开发尤为重要: 1. **增强的图形功能**:MIDP2.0支持Canvas类的扩展,允许开发者使用更复杂的图形和动画效果。Canvas类提供了绘制基本形状...

    MIDP2.0讲座

    这个“MIDP2.0讲座 从基础说起”可能是针对初学者或者开发者的一系列教程,旨在系统地介绍如何利用MIDP2.0开发移动应用程序。 **MIDP2.0的关键特性** 1. **用户界面增强**:MIDP2.0引入了新的用户界面组件,如...

    [图文]NEC手机JAVA MIDP2.0讲座(附源码)

    NEC-MobileFriend带给我们的MIDP2.0讲座秉承JAVA初级讲座的对话形式,配合丰富生动的插图,以NEC N840手机为例介绍了MIDP2.0的新特性,包括GameAPI中各个类的使用,3D动画的开发以及NEC的UI API等等。 讲座目录: ...

    深入MIDP2.0(2) - CLDC与MIDP工具类别

    MIDP2.0是MIDP的一个重要版本,增加了许多新特性,如:增强的用户界面组件,支持蓝牙和Wi-Fi连接,以及对XML和SSL的支持,使得开发更复杂、功能更全面的移动应用成为可能。 文档可能涵盖了以下知识点: 1. **...

    J2me中文教程MIDP2.0

    本文档全面覆盖了MIDP 2.0的关键特性,包括用户界面设计、多媒体集成、网络编程、数据存储与管理、定位服务以及安全性。通过学习这些内容,开发者能够更好地掌握MIDP 2.0的核心概念和技术细节,从而开发出高质量的...

    midp2.0:WTK源代码

    "midp2.0fcs"可能是Midp 2.0的最终候选版本(Final Candidate Stage)的压缩包文件,包含了完整的源代码。下载并解压后,开发者可以通过阅读文档、编译源码以及运行模拟器来学习和探索MIDP 2.0的实现。 总的来说,...

    MIDP2.0 稀有资源 与你分享

    本文将深入探讨MIDP2.0的关键特性和应用场景。 **1. MIDP2.0的特性** - **用户界面增强**:MIDP2.0引入了更强大的用户界面组件,包括可定制的表单元素、菜单和对话框,使得开发者能够创建更加用户友好的应用程序。...

    midp2.0 API 包含 NokiaUI

    Midp2.0 API 是Java ME(Micro Edition)平台的一部分,专为移动设备和嵌入式系统的应用程序开发设计。NokiaUI 是诺基亚公司针对Midp2.0 API 提供的一个扩展,它提供了丰富的用户界面组件和功能,使得开发者能够创建...

    j2me的midp2.0所有源代码

    这个压缩包文件包含了J2ME MIDP 2.0的所有源代码,对于想要深入理解J2ME、特别是MIDP 2.0特性的开发者来说,是一份非常宝贵的资源。 MIDP 2.0主要包含以下几个关键部分: 1. 用户界面:MIDP 2.0提供了一个轻量级的...

    MIDP 2.0游戏API快速入门

    本篇将详细介绍如何利用MIDP 2.0中的javax.microedition.lcdui.game包来快速入门手机游戏开发。 ### javax.microedition.lcdui.game包介绍 javax.microedition.lcdui.game包是Java ME为游戏开发提供的一系列类和...

    MIDP 2.0 TheGame API

    **MIDP 2.0 The Game API** 是一个针对移动设备的游戏开发接口,它是Java Micro Edition (JME) 的一部分,特别设计用于在功能受限的移动设备上创建丰富的游戏体验。MIDP 2.0是MIDP平台的一个重要升级,提供了更多的...

    MIDP2.0 Game API简介

    本文将对 MIDP 2.0 的 Game API 进行详细介绍,并结合实际应用场景来帮助读者更好地理解和应用这一 API。 #### 二、MIDP 2.0 Game API 概述 MIDP 2.0 Game API 是 J2ME 平台上专门为移动游戏设计的一套 API。相较于...

    MIDP2.0API

    MIDP2.0 API,J2me必用,MIDP2.0 API,MIDP2.0 APIMIDP2.0 API

    什么是MIDP2.0?

    对于N840这样的新设备,由于它支持MIDP2.0,开发者可以利用这些新特性来开发更丰富的应用。不过,与之前的N820相比,开发流程可能会有所不同,可能需要新的模拟器和工具链。因此,开发者需要按照特定的教程(如...

    MIDP2.0讲座(8)

    这个讲座系列的第八部分将深入探讨MIDP2.0的关键特性和技术,帮助开发者更有效地创建功能丰富的移动应用程序。 ### 1. MIDP2.0概述 MIDP2.0是MIDP1.0的升级版本,引入了多项新功能和改进,以增强用户体验和开发者...

    j2me Game Development with MIDP2.0

    MIDP2.0相对于之前的版本,引入了许多新特性,提升了游戏开发的体验和性能。例如,它提供了更强大的用户界面组件,包括Canvas类,使得开发者可以自定义绘制游戏画面;增加了对多媒体支持,如音频和图像处理,为游戏...

    j2me的midp2.0的源代码

    1. **增强的用户界面**:MIDP 2.0引入了新的用户界面组件,如ChoiceGroup,TextBox,DateField等,使得开发者能够创建更丰富、更复杂的用户界面。 2. **Java.comm API支持**:允许开发者访问设备的串行通信端口,...

    MIDP 2.0 游戏开发

    **MIDP 2.0的关键特性** 1. **用户界面组件**:MIDP 2.0提供了一系列的轻量级UI组件,如表单、按钮、列表和文本框,使得开发者可以创建出具有图形用户界面的游戏。 2. **CLDC支持**:MIDP 2.0通常与Connected ...

Global site tag (gtag.js) - Google Analytics