//Project.java package magic; import java.io.IOException; import java.util.Random; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.Image; import javax.microedition.media.Manager; /** * @author boolean liuhao137310@163.com: qq:402662067 * @version 创建时间:2009-2-4 下午04:44:19 * @TODO 模仿幻灯片中20种切换效果 可以循环播放 最多播放2张图片 数量多了还没有考虑 */ public class Project extends Canvas implements CommandListener,Runnable { private Display display; /** 要返回的界面 */ private Displayable last; /** 水平百叶窗效果用到的变量,百叶窗的高度 40*/ private int horizonalShutter = 40; /** 棋盘格效果用的的变量, */ private int chessBoard = 30; /** 随机水平线条效果用到的变量, */ private Random rand = new Random(); /** 随机水平线条效果中线条的数量 */ private int number = 320; /** 新图片从左插入,旧图片向右抽走 图片的水平方向的坐标递增 */ private int positionX = 0; /** 新图片从下插入,旧图片向上抽走 图片的垂直方向的坐标 */ private int positionY = 320; /** 新图片从右插入,旧图片向左抽走,图片的水平方向的坐标递减 */ private int posX = 240; /** 新图片从上插入,就图片向下抽走,图片的垂直方向的坐标递增 */ private int posY = 0; /** 上下向中央收缩 镂空的地方的垂直坐标 */ private int cutY = 0; /** 中央向两边展开 镂空地方的水平坐标 */ private int cutX = 120; /** 中央向上下扩展 镂空地方的垂直坐标 */ private int carveY = 160; /** 左右两边向中央收缩 左边镂空地方的水平坐标 */ private int carveX = 0; /** 图片从左下角插入 新图片的水平方向的坐标 */ private int leftBottomInsertX = 0; /** 图片从右下角插入 新图片的水平方向的坐标 */ private int rightBottomInsertX = 240; /** 图片从右上角插入 新图片的水平方向的坐标 */ private int rightTopInsertX = 240; /** 图片从左上角插入 新图片的水平方向的坐标 */ private int leftTopInsertX = 0; /** 根据此值的不同而出现不同的效果 */ int branch = 0; /** 图片从中间一个小矩形逐渐扩大 中间矩形的宽度 0 */ private int rectWidth = 0; /** 模仿幻灯片中加号的切换效果 左上角小矩形的水平坐标 120 */ private int leftTopRectX = 120; /** 溶解效果中 方块的数量 300 */ private int amount = 300; /** 纵向棋盘格的效果 格子初始高度 */ private int verticalChessboard = 30; /** 垂直百叶窗效果用到的变量,百叶窗的宽度 30 */ private int verticalShutter = 30; /** 线程运行的标志状态 */ private boolean keep = true; /** 屏幕高度 */ private int height; /** 屏幕宽度 */ private int width; public MyCanvas(Display display, Displayable last) { this.display = display; this.last = last; this.setFullScreenMode(true); this.addCommand(new Command("返回", Command.BACK, 1)); this.setCommandListener(this); height = getHeight(); width = getWidth(); new Thread() { public void run() { try { DataBufferPool.player = Manager .createPlayer(DataBufferPool.selectMusicPath); DataBufferPool.player.prefetch(); DataBufferPool.player.realize(); DataBufferPool.player.setLoopCount(-1); DataBufferPool.player.start(); } catch (Exception e) { } } }.start(); /** 启动线程 */ new Thread(this).start(); } protected void paint(Graphics g) { if (keep) { switch (branch) { case 0:// 水平百叶窗的效果,窗的最大高度是40 g.drawImage(DataBufferPool.img[0], 0, 0, 0); for (int i = 0; i < 8; i++) { g.setClip(0, 40 * i, 240, horizonalShutter); g.drawImage(DataBufferPool.img[1], 0, 0, 0); } /** 记得在这把最后一个效果用到的变量设为初始值去 */ back(); //verticalShutter = 30; break; case 1:// 横向棋盘格效果 每个棋盘格的最大宽度是30,高度是16 g.drawImage(DataBufferPool.img[2], 0, 0, 0); for (int i = 0; i < 20; i++) { for (int j = 0; j < 20; j += 2) { g.setClip(i * 30, j * 16, chessBoard, 16); g.drawImage(DataBufferPool.img[0], 0, 0, 0); g.setClip(i * 30 - 15, (j + 1) * 16, chessBoard, 16); g.drawImage(DataBufferPool.img[0], 0, 0, 0); } } horizonalShutter = 40; break; case 2:// 随机水平线条的效果, g.drawImage(DataBufferPool.img[3], 0, 0, 0); for (int i = 0; i < number; i++) { int j = rand.nextInt(320); g.setClip(0, j, 240, 1); g.drawImage(DataBufferPool.img[2], 0, 0, 0); } chessBoard = 30; break; case 3:// 新图片从左插入,旧图片向右抽走 g.drawImage(DataBufferPool.img[3], positionX, 0, 0);// 描点为左上角 g.drawImage(DataBufferPool.img[4], positionX, 0, 24);// 描点为右上角 number = 320; break; case 4:// 新图片从下插入,旧图片向上抽走 g.drawImage(DataBufferPool.img[4], 0, positionY, 36);// 左下角 g.drawImage(DataBufferPool.img[5], 0, positionY, 0);// 左上角 positionX = 0; break; case 5:// 新图片从右插入,旧图片向左抽走 g.drawImage(DataBufferPool.img[5], posX, 0, 24);// 右上角 g.drawImage(DataBufferPool.img[6], posX, 0, 0);// 左上角 positionY = 320; break; case 6:// 新图片从上插入,旧图片向下抽走 g.drawImage(DataBufferPool.img[6], 0, posY, 0); g.drawImage(DataBufferPool.img[7], 0, posY, 36); posX = 240; break; case 7:// 上下向中央收缩 镂空上下两块 逐渐显现新图片 g.drawImage(DataBufferPool.img[7], 0, 0, 0); g.setClip(0, 0, 240, cutY); g.drawImage(DataBufferPool.img[8], 0, 0, 0); g.setClip(0, 320 - cutY, 240, cutY); g.drawImage(DataBufferPool.img[8], 0, 0, 0); posY = 0; break; case 8:// 中央向两边展开 g.drawImage(DataBufferPool.img[9], 0, 0, 0); g.setClip(0, 0, cutX, 320); g.drawImage(DataBufferPool.img[8], 0, 0, 0); g.setClip(240 - cutX, 0, cutX, 320); g.drawImage(DataBufferPool.img[8], 0, 0, 0); cutY = 0; break; case 9:// 中央向上下扩展 g.drawImage(DataBufferPool.img[9], 0, 0, 0); g.setClip(0, carveY, 240, 2 * (160 - carveY)); g.drawImage(DataBufferPool.img[10], 0, 0, 0); cutX = 120; break; case 10:// 左右两边向中央收缩 g.drawImage(DataBufferPool.img[10], 0, 0, 0); g.setClip(0, 0, carveX, 320); g.drawImage(DataBufferPool.img[11], 0, 0, 0); g.setClip(240 - carveX, 0, carveX, 320); g.drawImage(DataBufferPool.img[11], 0, 0, 0); carveY = 160; break; case 11:// 从左下角插入图片 g.drawImage(DataBufferPool.img[11], 0, 0, 0); g.drawImage(DataBufferPool.img[12], leftBottomInsertX, -4 * leftBottomInsertX / 3 + 320, 24); carveX = 0; break; case 12:// 从右下角插入图片 g.drawImage(DataBufferPool.img[12], 0, 0, 0); g.drawImage(DataBufferPool.img[13], rightBottomInsertX, 4 * rightBottomInsertX / 3, 0); leftBottomInsertX = 0; break; case 13:// 从右上角插入图片 g.drawImage(DataBufferPool.img[13], 0, 0, 0); g.drawImage(DataBufferPool.img[14], rightTopInsertX, -4 * rightTopInsertX / 3 + 320, 36);// 左下角 rightBottomInsertX = 240; break; case 14:// 从左上角插入图片 g.drawImage(DataBufferPool.img[14], 0, 0, 0); g.drawImage(DataBufferPool.img[15], leftTopInsertX, 4 * leftTopInsertX / 3, 40);// 右下角 rightTopInsertX = 240; break; case 15:// 由中间的小矩形逐渐变大 直至完全显现出新图片 g.drawImage(DataBufferPool.img[15], 0, 0, 0); g.setClip(120 - rectWidth / 2, 160 - 2 * rectWidth / 3, rectWidth, 4 * rectWidth / 3); g.drawImage(DataBufferPool.img[16], 0, 0, 0); leftTopInsertX = 0; break; case 16:// 幻灯片中加号的切换效果 g.drawImage(DataBufferPool.img[17], 0, 0, 0); g.setClip(0, 0, leftTopRectX, 4 * leftTopRectX / 3); g.drawImage(DataBufferPool.img[16], 0, 0, 0); g.setClip(240 - leftTopRectX, 0, leftTopRectX, 4 * leftTopRectX / 3); g.drawImage(DataBufferPool.img[16], 0, 0, 0); g.setClip(0, 320 - 4 * leftTopRectX / 3, leftTopRectX, 4 * leftTopRectX / 3); g.drawImage(DataBufferPool.img[16], 0, 0, 0); g.setClip(240 - leftTopRectX, 320 - 4 * leftTopRectX / 3, leftTopRectX, 4 * leftTopRectX / 3); g.drawImage(DataBufferPool.img[16], 0, 0, 0); rectWidth = 0; break; case 17:// 溶解的效果 g.drawImage(DataBufferPool.img[18], 0, 0, 0); for (int i = 0; i < amount; i++) { int x = rand.nextInt(240); int y = rand.nextInt(320); g.setClip(x, y, 10, 15); g.drawImage(DataBufferPool.img[17], 0, 0, 0); } leftTopRectX = 120; break; case 18:// 纵向棋盘格效果 g.drawImage(DataBufferPool.img[19], 0, 0, 0); for (int i = 0; i < 20; i++) { for (int j = 0; j < 30; j += 2) { g.setClip(i * 30, j * 15, 15, verticalChessboard); g.drawImage(DataBufferPool.img[18], 0, 0, 0); g.setClip(i * 30 + 15, j * 15 - 15, 15, verticalChessboard); g.drawImage(DataBufferPool.img[18], 0, 0, 0); } } amount = 300; break; case 19:// 垂直百叶窗 g.drawImage(DataBufferPool.img[20], 0, 0, 0); for (int i = 0; i < 8; i++) { g.setClip(i * 30, 0, verticalShutter, 320); g.drawImage(DataBufferPool.img[19], 0, 0, 0); } verticalChessboard = 30; break; } } } public void run() { while (keep) { switch (branch) { case 0: while (horizonalShutter > -1) { try { Thread.currentThread().sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } horizonalShutter--; repaint(); } cycle(); break; case 1: while (chessBoard > 0) { try { Thread.currentThread().sleep(60); chessBoard--; } catch (InterruptedException e) { e.printStackTrace(); } repaint(); } cycle(); break; case 2: while (number > 0) { try { Thread.currentThread().sleep(100); number -= 10; } catch (InterruptedException e) { e.printStackTrace(); } repaint(); } cycle(); break; case 3: while (positionX < 240) { try { Thread.currentThread().sleep(50); positionX++; } catch (InterruptedException e) { e.printStackTrace(); } repaint(); } cycle(); break; case 4: while (positionY > 0) { try { Thread.currentThread().sleep(50); positionY--; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } cycle(); break; case 5: while (posX > 0) { try { Thread.currentThread().sleep(50); posX--; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } cycle(); break; case 6: while (posY < 320) { try { Thread.currentThread().sleep(50); posY++; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } cycle(); break; case 7: while (cutY < 160) { try { Thread.currentThread().sleep(50); cutY++; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } cycle(); break; case 8: while (cutX > 0) { try { Thread.currentThread().sleep(50); cutX--; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } cycle(); break; case 9: while (carveY > 0) { try { Thread.currentThread().sleep(50); carveY--; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } cycle(); break; case 10: while (carveX < 120) { try { Thread.currentThread().sleep(50); carveX++; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } cycle(); break; case 11: while (leftBottomInsertX < 240) { try { Thread.currentThread().sleep(50); leftBottomInsertX += 3; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } cycle(); break; case 12: while (rightBottomInsertX > 0) { try { Thread.currentThread().sleep(50); rightBottomInsertX -= 3; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } cycle(); break; case 13: while (rightTopInsertX > 0) { try { Thread.currentThread().sleep(50); rightTopInsertX -= 3; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } cycle(); break; case 14: while (leftTopInsertX < 240) { try { Thread.currentThread().sleep(50); leftTopInsertX += 3; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } cycle(); break; case 15: while (rectWidth < 240) { try { Thread.currentThread().sleep(100); rectWidth += 3; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } cycle(); break; case 16: while (leftTopRectX > 0) { try { Thread.currentThread().sleep(100); leftTopRectX -= 3; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } cycle(); break; case 17: while (amount > 0) { try { Thread.currentThread().sleep(100); amount -= 15; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } cycle(); break; case 18: while (verticalChessboard > 0) { try { Thread.currentThread().sleep(20); verticalChessboard--; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } cycle(); break; case 19: while (verticalShutter > 0) { try { Thread.currentThread().sleep(100); verticalShutter--; repaint(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } branch = 0; repaint(); break; } } } /**run函数中每个switch语句中都要执行的*/ private void cycle(){ try { Thread.currentThread().sleep(2000);//线程休眠2秒钟 让照片静止显示2秒钟 } catch (InterruptedException e1) { e1.printStackTrace(); } branch++; if(branch+1 == DataBufferPool.numberofpic){ //判断递增后的branch的值 当和照片数相等时候就循环回第一个效果 branch = 0; } repaint(); } /**当照片数小于总的切换效果数时候*/ private void back(){ switch(DataBufferPool.numberofpic){ case 0: break; case 1: break; case 2: break; case 3: chessBoard = 30; break; case 4: number = 320; break; case 5: positionX = 0; break; case 6: positionY = 320; break; case 7: posY = 0; break; case 8: posY = 0; break; case 9: cutY = 0; break; case 10: cutX = 120; break; case 11: carveY = 160; break; case 12: carveX = 0; break; case 13: leftBottomInsertX = 0; break; case 14: rightBottomInsertX = 240; break; case 15: rightTopInsertX = 240; break; case 16: leftTopInsertX = 0; break; case 17: rectWidth = 0; break; case 18: leftTopRectX = 120; break; case 19: amount = 300; break; case 20: verticalChessboard = 30; break; default: verticalShutter = 30; break; } } public void commandAction(Command c, Displayable d) { keep = false; DataBufferPool.player.close(); /** 返回上一界面 */ display.setCurrent(this.last); } } 其中的DataBufferPool是一个数据类 图片和音乐对象都在其中,这个程序 可以一边播放音乐一边欣赏图片