J2me中實現淡入淡出效果【收錄】

J2me中實現淡入淡出效果
3["ixQ`KE0飄飄白雲([email protected])

    在J2me中實現淡入淡出效果,據我所知至少有三種方法。3GEYE5u1q$o,}?-Kk
第一種是取得需要變換圖片的像素,依次設置每個象素的alpha通道值,讓它在0~100之間變化。
N{"Bt P0~0    第二種是修改圖片的調色板數據,讓其在調色板原始數據到255之間變化。
8o+j(P~@0    第三種,其實也是利用上面的辦法,先描畫圖片,然後在圖片上覆蓋一個黑色矩形,改變這個黑色矩形透明度就可以實現淡入淡出的效果。
(t4Ho3M"D!c a a8R S0    前兩種方法相比較的話,第一種方法運算量是比較大的,而且第一種方法由於midp1.0不支持alpha通道,在一些手機上無法實現。

    下面給出第二種方法的示例,在我們開始之前,應該熟悉png文件格式,如果還不是很明白的話,可以google一下,或者查看前面的帖子中的相關連接。

3GEYE+tXQ /~:~3MGw
    代碼很清楚,下面是源代碼

------------CODE__START-----------------------
*c"s'R+n/VJ9Sb0import java.io.DataInputStream;
6~%C Iy _~4cl0import java.util.Timer;
"c[3E!z'f6veT0import java.util.TimerTask;

import javax.microedition.lcdui.Canvas;3GEYE5T9h&H6H(}*C xKw
import javax.microedition.lcdui.Display;
4flPh~AACi0import javax.microedition.lcdui.Graphics;
4fGnLO'D0import javax.microedition.lcdui.Image;3GEYEB3}p }[+L"I3^
import javax.microedition.midlet.MIDlet;3GEYE:_0r+Gv-n
import javax.microedition.midlet.MIDletStateChangeException;

/**
_ez6q.DA5_0 * Discription      : 修改調色板數據實現淡入淡出效果3GEYExU/0P(mX/7_A
 * Author           : 飄飄白雲([email protected])3GEYE@E{)`xA8T%a
 * Created date     : 2006/07/13 18:06:393GEYEK*E a f"[Lk
 * Modified history :
N4s~3cL7WJQ0 */

public class PngFadeInOut extends MIDlet
UeG|)I2Tp8O+X/ C `o0{3GEYE5n(a#IzSI5jP4FG;N+E
                           GameCanvas canvas;3GEYEcv{#I;a2F~
                  Display display;
$})J/r*^n%F0                            public PngFadeInOut()3GEYEc.k`*d+[lAb,Gh
                            {
e|/}6Vz)s0                                          super();
/h-pgJl7u0                                          try {3GEYEIYW{-FsrSM
                          display = Display.getDisplay(this);
zKy!r9D0                          canvas = new GameCanvas(this);3GEYEAdS:f'Q%c
                      } catch (Exception e) {}3GEYE0hCQF$S)_
                            }

                            protected void startApp() throws MIDletStateChangeException
4n#UJ7Y4x KG+SR0                            {3GEYE4MZ%{#?)CC�eU t?1YYP
                                          if( canvas != null ){
gnxiN7V0z$j'A0                                                        display.setCurrent(canvas);3GEYEa&x ftak't{
                                                        canvas.start();3GEYE7G�bH2S `5rr
                                          }[email protected]{ k1@ A
                            }

                            protected void pauseApp()3GEYEj-Pmh~(K v,|a
                            {3GEYEQ1|M s mrv!`
                                          canvas.isExit = true;3GEYE,at.C ?6q{ q.l7M'b
                            }

                            protected void destroyApp( boolean arg0) throws MIDletStateChangeException
/'XsfJ*w9U"?0                            {3GEYE!HC d6[h0GGN
                            }
'g0T$^_E;V-EP1G$B[!j�]0              }

              class GameCanvas extends Canvas3GEYE~c ~BOL6km
              {
7?#Qx'Lqi,?0                            static String imageName = "/fadeInOut.png";
vchPn L-T0                            public static final int    MAX_TARDINESS = 30;
x9wzX5t$` m0                           3GEYE[(b�^7wF ?7a}c
                            //---------------------------------------------------
0EVrg'nE0                            PngFadeInOut app;3GEYEcR,aY/R5n
                            boolean isInited = false;3GEYE+Vf{%WL,m+/g1D
                            public boolean isExit = false;

                            Image offImage             = null;3GEYE3m.C7x,KF-k+s/s
                            public Graphics             g = null;
Pr.IZ_6`1T5{0                            int scrW;
V*?QHmlb6Q'V0                            int scrH;

                            //---------------------------------------------------3GEYE/N1M1EL#i4|O` Q0Ko
                            int gameMode;3GEYE9Q(d+tq(w
                            int subMode;
N9_&l0y.Q~0                           3GEYEe)RL/g,K re
                            static final int smInit = 0;
9l�q t;nS%}X!V0                            static final int smProc = 1;3GEYEk6/:`Q-e2r
                            static final int smEnd = 2;
9Pi]q4@@0                           3GEYEjGdi F]
                            static final int gmStart = 0;3GEYE,w;qu[8`"c%X
                           
m|/UwW#c R0                            //---------------------------------------------------
}&h@p2A9y0                            Image testImage = null;3GEYEXCh5h+l+EYi6P
                           3GEYEe/e(]X8c'EEH
                            byte[] oldRGBData = null;
g"T!TR]0                            byte[] imgData = null;3GEYEl`#k5H/y1Z
                           3GEYE"z6M�b ^ ?
                            static final int FADE_IN = 0;
+}(x1_D$@@-[0                            static final int FADE_OUT = 1;
/G�S^;i4x7]]P%i0                            static final int FADE_STEP = 1;3GEYEK,l Jz5uR
                           
f /&PFz6R'SG0                            static int fadeType = FADE_IN;
5v1RN0VP0                           
j[EkCo&m,[!g0                            //---------------------------------------------------3GEYE#?Ge(t7?s7/l@
                            //---Timer process
"/whue0                            //---------------------------------------------------3GEYEdK@ o:a$/*Z9qf9Qf
                            TimerTask task;
,JWe;wr!C0                            Timer timer;3GEYE+m'[1hf/}2bm~
                            int timerDelayTime;
J�o;MZ7MO0                            public boolean isTimerRunning;
6HMNX/rC;v0                           
(L/tVg'Ek/V0                            void startTimer(int delayTime){
8n~@9MP4d^0                                          timerDelayTime = delayTime;
L`-{`8V&d0                                          isTimerRunning = true;
"EUs{PL0                                         
:gK/ZEzi!c.y-S0                                          timer = new Timer();3GEYE�trh5X*Rs U#jET
                                          task = new ProcessingRunner();3GEYE;K2Mu%l,^(A"o
                                          timer.scheduleAtFixedRate(task, 0, delayTime);3GEYE5v;N4b2q2R;e7kEA$l*b
                            }3GEYEa H%y]*P5} N
                           
N{o@u0                            public void stopTimer(){
9S~a�PWZ2j O0                                          if( task != null )
@,/B c n(KeE�t0                                                        task.cancel();3GEYE;w(m.@g&ut�iK�N
                                         3GEYE,/ C5D4LG
                                          isTimerRunning = false;3GEYEI i ^jyg+mSF9b
                                          timer = null;3GEYE O5e|HwZ
                                          task = null;3GEYE Ex,sa/L]"_6J
                            }3GEYE T[(x/X6Pu5UQ"l1R
                            //-----------------------------------------------------3GEYE"H'P ] b;/D0k1S,u_-j
                            class ProcessingRunner extends TimerTask
,`H a/P%Xy4D7r){et0                            {
EfI./8|/0                                          public void run()3GEYE1Bv7`Gg{0lH�X&]T-N
                                          {3GEYEq.KG&G.cct)wjp*~
                                                        if( isExit ) {
p:Xc,Vn-mm[Kw0                                                                      stopTimer();3GEYEet k@-SDc,_1yz0k%Z
                                                                      app.notifyDestroyed();3GEYE(mTI%P(h?$LN|
                                                        }
8[5H*|+xx.~!m0                                                       
6H-g|5SW2ZY8ZL0                                                        if (!isTimerRunning || System.currentTimeMillis() -
,n9J5ei }�]0                                                                                    scheduledExecutionTime() >= timerDelayTime)3GEYE*l a ZK)l5K)s
                                                        {3GEYE}M+J6L,i
                                                                      return;
Br!V6i{]0                                                        }

                                                        gameMain();3GEYEv:^'kw/D"b)@%q F8`
                                                        gameDraw();
.LA OQb?D3~0                                                       3GEYE�~|#jH }�O C$t:Xa*?^
                                                        repaint();3GEYEF'Ayo1t#R
                                                        serviceRepaints();3GEYE:Sije~;mHy IGxz
                                                        System.gc();3GEYE`6d'Z qC7R)M[w,dH
                                          }3GEYE:{IT;MkOg
                            }3GEYE.R5L*Ex!`,@@3Q
                            //-------------------------------------------------
0cz�ZN.A%iuE9S0                           3GEYE7q ZO$h ~d.{P
                            public GameCanvas(MIDlet midlet)3GEYE,Aa2MkdsP�yk@,b
                            {3GEYEVW8ks&jWg x'j
                                          app = (PngFadeInOut)midlet;
zU:r aM*^*Ub@ M0                            }

             
M(X oNYxP'o0                           3GEYE}"lSt4yN)o
                            public void start()3GEYE4yIT1ufQ5F
                            {
*w C(~!yw)I@A0                                          setFullScreenMode(true);
xe+dX!rj8UR*w9I0                                          while (!isShown())3GEYE E6M)l'vW5s
                                                        ;3GEYEL@4~%FJNp+W
                                         3GEYEu:n(oyB'{
                                          if( !isInited ) {
nnb7Z$cM0                                                        gameInit();3GEYEs"[email protected]+X2{3Q"o
                                                        isInited = true;3GEYE(`'XVV$c?)x
                                          }

                                          startTimer(MAX_TARDINESS);3GEYEs)GS:Oz!W
                            }3GEYE1J@/(t cl8w2lMkr
                           3GEYE+LY_@s8g&W3f ]
                            void gameInit()3GEYEX-]t,Oq$l/?A
                            {
`gc-DtaL)F'l"^;H0                                          scrW = getWidth();
gq#D7C7ss'c'D0                                          scrH = getHeight();

                                          if(g == null || offImage == null) {
+HI?v)D0                                                        offImage = Image.createImage(scrW, scrH);
1q_+P.Q+h0                                              g = offImage.getGraphics();
(?7R.MA�gdxF0                                          }3GEYEN2o^k,Xl3k0`
                                         
;M J+st]n6T;C0                                          changeGameMode(gmStart);3GEYE x2v1p�z9]7T
                            }

                            public void changeGameMode(int gm){3GEYE(]-~!xM x V[
                                          gameMode = gm;3GEYEXbc1AJ-p3JT P
                                          subMode = smInit;3GEYE3mI?HIx/iQ
                            }
0D,U/Q4g/GG!{ XX0                           
MciyXn"^XD)t0                            //---------------------------------------------------
c5G#M!Gag0                            // 遊戲主邏輯處理3GEYENAi/Y fq#c*J2q
                            //---------------------------------------------------
ht {q7m"H/V0                            void gameMain()
v5j%P7IfZ i G0                            {
r*yq3EI ?"m0                                          if( gameMode == gmStart )
4w} Hp Be0                                          {3GEYE.B5S MRlol4];j
                                                        if( subMode == smInit )3GEYEQ�h8N_7^ B
                                                        {3GEYEb;]:qI6?
                                                                      // 取得圖片的二進制數據
Ht^9k&Z,eHjt0                                                                      imgData = loadFile(imageName);3GEYEC+L2W/H;h
                                                       
'vFET(F0                                                                      //保存原始圖片的調色板rgb數據3GEYE"P$t{q+Kks6O(v%n0q
                                                                      oldRGBData = getPlteRGBData(imgData);
k/s+~+t!ju0                                                       
-[*m+a*JZu$nsh0                                                                      if( fadeType == FADE_IN) {3GEYE[j(O4i jC9viiz
                                                                                    // 設置調色板顏色爲白色,淡入效果
Z_,x sE@Y0                                                                                    for(int i = rgbDataStartPos; i < rgbDataStartPos + rgbDataLength;i++ ) {3GEYE/KL,ubO2V2b$H
                                                                                                  imgData[i] = (byte)255;
:pq9b/U%fC�FZH0                                                                                    }
-F?;vKO0 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章