www.pudn.com > Fading.rar > Fading.java
/**
*
* By: Oscar Wivall
* Date: 2004-05-06
*
* Description: Create cool effects by fading in/out the images in MIDP 2.0.
* This midlet shows how to change the alpha value of an Image.
*
* This MIDlet is tested on Z1010 and K700.
*
*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;
/*
* Main class. Create TheCanvas, Add a exit button and display the canvas.
*/
public class Fading extends MIDlet
implements CommandListener{
private Command mExitCommand;
public void startApp() {
mExitCommand = new Command("Exit", Command.SCREEN, 0);
TheCanvas tc = new TheCanvas();
tc.addCommand(mExitCommand);
tc.setCommandListener(this);
Display d = Display.getDisplay(this);
d.setCurrent(tc);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command c, Displayable d){
notifyDestroyed();
}
}
/*
* TheCanvas class: loads both of the images used in this MIDlet,
* uses graphics do do the backbuffer drawing,
* uses ImageEffect do do the Image blending.
*/
class TheCanvas extends Canvas
implements Runnable{
private Image mJavaImage;
private Image mBgImage;
private Image mBufferImage;
private Graphics mGraphics;
private boolean mTrucking = true;
private boolean mUpdate = true;
private int mAlpha = 0;
private int mValue = 5;
private int[]rawInt; // this is the array who will hold the image ARGB values.
// to do the blending we will change the Alpha value.
private Runtime rt;
public TheCanvas(){
rt = Runtime.getRuntime(); // to get the amount of free memory.
// Load images. Use mGraphics to draw on the backbuffer.
mBufferImage = Image.createImage(getWidth(), getHeight());
mGraphics = mBufferImage.getGraphics();
try{
mJavaImage = Image.createImage("/java.png");
mBgImage = Image.createImage("/bg.png");
}catch(Exception e){}
// Allocate mamory for the image array.
// Use the getRGB method to get all ARGB values from the image to the rawInt array.
rawInt = new int[mJavaImage.getWidth() * mJavaImage.getHeight()];
mJavaImage.getRGB(rawInt, 0, mJavaImage.getWidth(), 0, 0, mJavaImage.getWidth(), mJavaImage.getHeight());
Thread t = new Thread(this);
t.start();
}
// draw the image to the canvas.
public void paint(Graphics g){
g.drawImage(mBufferImage, 0, 0, 0);
g.drawString("freeMemory=" + String.valueOf(rt.freeMemory()), 0, 100, 0);
mUpdate = true;
}
public void run() {
while(mTrucking){
if(mUpdate){
// change the alpha value each loop. 255=opaque, 0=transparent.
mAlpha+= mValue;
if(mAlpha>=255)
mValue = mValue *-1;
else if(mAlpha<=0)
mValue = mValue *-1;
// Use the blend method in ImageEffect the change the Alpha value.
// create a new Image from the new rawInt array.
ImageEffect.blend(rawInt, mAlpha);
Image fadingImage = Image.createRGBImage(rawInt, mJavaImage.getWidth(), mJavaImage.getHeight(), true);
mGraphics.setColor(0xFFFFFF);
mGraphics.fillRect(0, 0, getWidth(), getHeight());
mGraphics.drawImage(mBgImage, 0, 0, 0);
mGraphics.drawImage(fadingImage, 0, 10, 0);
System.gc();
mUpdate = false;
}
repaint();
}
}
}
/*
* This class changes the alpha value of an image array.
* All the pixels in the image contains Alpha, Red, Green, Blue (ARGB) colors
* where each of the color is a value from 0 to 255.
* If Alpha is 255 the pixel will be opaque, if its 0 the pixel is transparent.
* 0xFFFF0000 = 11111111 11111111 00000000 00000000 - this is a red opaque pixel.
*
* To get the RGB values from the array we can use the AND '&' operator.
* (11111101 & 01111110) = 01111100, only the 1:s where & = 1 will get through.
*
* to change 11111111 to 11111111 00000000 00000000 00000000 we can use the
* shift left operator '<<', (00000001 << 7) = 10000000 in dec (1<<7) = 128
*
* To change the alpha value we loop through all the pixels in the image.
*
* With the blend method its also possible to mask and dontmask specific colors.
*/
class ImageEffect{
// raw is the image array.
public static void blend(int[] raw, int alphaValue, int maskColor, int dontmaskColor){
int len = raw.length;
// Start loop through all the pixels in the image.
for(int i=0; i0){
a = alphaValue; // set the alpha value we vant to use 0-255.
}
a = (a<<24); // left shift the alpha value 24 bits.
// if color = 00000000 11111111 11111111 00000000
// and alpha= 01111111 00000000 00000000 00000000
// then c+a = 01111111 11111111 11111111 00000000
// and the pixel will be blended.
color += a;
raw[i] = color;
}
}
public static void blend(int[] raw, int alphaValue){
blend(raw, alphaValue, 0xFFFFFFFF, 0xFFFFFFFF);
}
}