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是一个数据类 图片和音乐对象都在其中,这个程序 可以一边播放音乐一边欣赏图片