Fading.java
上传用户:gyyuli
上传日期:2013-07-09
资源大小:3050k
文件大小:6k
源码类别:

J2ME

开发平台:

Java

  1. /**
  2.  *
  3.  * By:      Oscar Wivall
  4.  * Date:    2004-05-06
  5.  *
  6.  * Description: Create cool effects by fading in/out the images in MIDP 2.0.
  7.  *              This midlet shows how to change the alpha value of an Image.
  8.  *
  9.  *              This MIDlet is tested on Z1010 and K700.
  10.  *
  11.  */
  12. import javax.microedition.midlet.*;
  13. import javax.microedition.lcdui.*;
  14. import javax.microedition.io.*;
  15. import java.io.*;
  16. /*
  17. *   Main class. Create TheCanvas, Add a exit button and display the canvas.
  18. */
  19. public class Fading extends javax.microedition.midlet.MIDlet 
  20.                         implements CommandListener{
  21.     private Command mExitCommand;
  22.     public void startApp() {
  23.         mExitCommand = new Command("Exit", Command.SCREEN, 0);
  24.         TheCanvas tc = new TheCanvas();
  25.         tc.addCommand(mExitCommand);
  26.         tc.setCommandListener(this);
  27.         Display d = Display.getDisplay(this);
  28.         d.setCurrent(tc);
  29.     }
  30.     public void pauseApp() {
  31.         
  32.     }
  33.     public void destroyApp(boolean unconditional) {
  34.     }
  35.     
  36.     public void commandAction(Command c, Displayable d){
  37.         notifyDestroyed();
  38.     }
  39. }
  40. /*
  41. * TheCanvas class: loads both of the images used in this MIDlet,
  42. *                  uses graphics do do the backbuffer drawing,
  43. *                  uses ImageEffect do do the Image blending.
  44. */
  45. class TheCanvas extends Canvas
  46.                 implements Runnable{
  47.     private Image orangeImage;
  48.     private Image greenImage;
  49.     private Image mBufferImage;
  50.     
  51.     private Graphics mGraphics;
  52.     
  53.     private boolean mTrucking = true;
  54.     private boolean mUpdate = true;
  55.     
  56.     private int mAlpha = 0;
  57.     private int mValue = 5;
  58.     private int[]rawInt; // this is the array who will hold the image ARGB values. 
  59.                          // to do the blending we will change the Alpha value.
  60.     
  61.     private Runtime rt;
  62.     public TheCanvas(){
  63.         
  64.         rt = Runtime.getRuntime(); // to get the amount of free memory.
  65.         
  66.         // Load images. Use mGraphics to draw on the backbuffer.
  67.         mBufferImage = Image.createImage(getWidth(), getHeight());
  68.         mGraphics = mBufferImage.getGraphics();
  69.         try{
  70.             orangeImage = Image.createImage("/orange.png");
  71.             greenImage = Image.createImage("/green.png");
  72.         }catch(Exception e){}
  73.         // Allocate mamory for the image array.
  74.         // Use the getRGB method to get all ARGB values from the image to the rawInt //array.
  75.         rawInt = new int[orangeImage.getWidth() * orangeImage.getHeight()];
  76.         orangeImage.getRGB(rawInt, 0, orangeImage.getWidth(), 0, 0, orangeImage.getWidth(), orangeImage.getHeight());
  77.         
  78.         Thread t = new Thread(this);
  79.         t.start();
  80.     }
  81.     // draw the image to the canvas.
  82.     public void paint(Graphics g){
  83.         g.drawImage(mBufferImage, this.getWidth()/2, this.getHeight()/2, g.VCENTER|g.HCENTER);
  84.         g.drawString("freeMemory=" + String.valueOf(rt.freeMemory()), 0, 100, 0);
  85.         mUpdate = true;
  86.     }
  87.     public void run() {
  88.         while(mTrucking){
  89.             if(mUpdate){
  90.                 // change the alpha value each loop. 255=opaque, 0=transparent.
  91.                 mAlpha+= mValue;
  92.                 if(mAlpha>=255)
  93.                     mValue = mValue *-1;
  94.                 else if(mAlpha<=0)
  95.                     mValue = mValue *-1;
  96.                 // Use the blend method in ImageEffect the change the Alpha value.
  97.                 // create a new Image from the new rawInt array.
  98.                 ImageEffect.blend(rawInt, mAlpha);
  99.                 Image fadingImage = Image.createRGBImage(rawInt, orangeImage.getWidth(), orangeImage.getHeight(), true);
  100.                 mGraphics.setColor(0xFFFFFF);
  101.                 mGraphics.fillRect(0, 0, getWidth(), getHeight());
  102.                 mGraphics.drawImage(greenImage,this.getWidth()/2, this.getHeight()/2, Graphics.VCENTER|Graphics.HCENTER);
  103.                 mGraphics.drawImage(fadingImage,this.getWidth()/2, this.getHeight()/2, Graphics.VCENTER|Graphics.HCENTER);
  104.                 System.gc();
  105.                 
  106.                 mUpdate = false;
  107.             }
  108.             repaint();
  109.         }
  110.     }
  111.     
  112. }
  113. /*
  114.  * This class changes the alpha value of an image array.
  115.  * All the pixels in the image contains Alpha, Red, Green, Blue (ARGB) colors
  116.  * where each of the color is a value from 0 to 255.
  117.  * If Alpha is 255 the pixel will be opaque, if its 0 the pixel is transparent.
  118.  * 0xFFFF0000 = 11111111 11111111 00000000 00000000 - this is a red opaque pixel.
  119.  *
  120.  * To get the RGB values from the array we can use the AND '&' operator.
  121.  * (11111101 & 01111110) = 01111100, only the 1:s where & = 1 will get through.
  122.  *
  123.  * to change 11111111 to 11111111 00000000 00000000 00000000 we can use the
  124.  * shift left operator '<<', (00000001 << 7) = 10000000 in dec (1<<7) = 128
  125.  *
  126.  * To change the alpha value we loop through all the pixels in the image.
  127.  *
  128.  * With the blend method its also possible to mask and dontmask specific colors.
  129. */
  130. class ImageEffect{
  131.     
  132.     // raw is the image array.
  133.     public static void blend(int[] raw, int alphaValue, int maskColor, int dontmaskColor){
  134.         int len = raw.length;
  135.         
  136.         // Start loop through all the pixels in the image.
  137.         for(int i=0; i<len; i++){
  138.             int a = 0;
  139.             int color = (raw[i] & 0x00FFFFFF); // get the color of the pixel.
  140.             if(maskColor==color){
  141.                 a = 0;
  142.             }else if(dontmaskColor==color){
  143.                 a = 255;
  144.             }else if(alphaValue>0){
  145.                 a = alphaValue;     // set the alpha value we vant to use 0-255.
  146.             }
  147.             
  148.             a = (a<<24);    // left shift the alpha value 24 bits.
  149.             // if color = 00000000 11111111 11111111 00000000
  150.             // and alpha= 01111111 00000000 00000000 00000000
  151.             // then c+a = 01111111 11111111 11111111 00000000
  152.             // and the pixel will be blended.
  153.             color += a;
  154.             raw[i] = color;
  155.         }
  156.     }
  157.     public static void blend(int[] raw, int alphaValue){
  158.         blend(raw, alphaValue, 0xFFFFFFFF, 0xFFFFFFFF);
  159.     }
  160. }