百叶窗效果
如图所示
有2个画面,其中一个以百叶窗形式消失,从而显示另一个画面。
这是很多游戏公司用到形式。
现写出2种画法 只写出竖的百叶,横的画法雷同。斜的我还没想到,呵呵
循环的控制可有线程Thread#sleep()方法或Timer#(TimerTask,long delay,long period)实现。我将分别演示给大家。
1。矩形画法
思路:在背景画面上画N个矩形,可以以不同的颜色绘制。矩形逐渐变小至无,从 而显示出背景画面。此法百叶窗可随机颜色显示,
import javax.microedition.lcdui.*;
class Abc extends Canvas implements Runnable {
/** 储存Image对象的变量 */
private Image imgb;
private boolean isStopped;
private int i;
/** 构造函数 */
Abc() {
//取得图像
try {
imgb = Image.createImage("/b.png");//获取背景图片
}catch(java.io.IOException e) {}
//开始描绘线程
doStart();
}
/** 启动动画线程的方法 */
private void doStart() {
isStopped = false;
Thread th = new Thread(this);
th.start();
}
/** 停止动画线程的方法 */
private void doStop() {
isStopped = true;
}
/** 动画线程处理部分 */
public void run() {
i=128/8;
while(! isStopped) {
try {
repaint(); //再描绘
Thread.sleep(100); //等待一定时间
i--; //矩形宽逐渐变小
if(i <0) { //矩形宽为0终止
doStop(); //也可写为i=0
}
}catch(InterruptedException e){}
}
}
/** 进行描绘的方法 */
protected void paint(Graphics g) {
//将背景涂白
g.setColor(0x00FFFFFF);
g.fillRect(0, 0, getWidth(), getHeight());
//画蓝
g.drawImage(imgb,0,0,20);//画背景图
for(int j=0;j<getWidth();j+=getWidth()/8){
g.fillRect(j,0,i,getWidth());//画矩形遮盖于背景
}
}
}
2。setClip画法
思路:画背景图。然后设置setClip范围为全屏,画显示图,然后缩小Clip范围至无,显示图将无法显示。出现北京图。试想一下,如果程序较大载入慢,将主程序设为背景,LOGO图片设为显示。使用Timer先显示LOGO,一段时间显示主届面。效果很好。
import javax.microedition.lcdui.*;
import java.util.Timer;
import java.util.TimerTask;
public class Abc extends Canvas {
/** 储存Image对象的变量 */
private Image imgb,logo;
private Timer b;
private int j=getWidth()/8;
private St t;
/** 构造函数 */
Abc() {
//取得图像
try {
imgb = Image.createImage("/b.png");//获取背景图片
logo = Image.createImage("/a.png");//logo图片
}catch(java.io.IOException e) {}
b= new Timer();
St t=new St();
b.schedule(t,1000,100); //LOGO图片显示1秒后以百叶窗形式消失,显示背景主界面
}
/** 进行描绘的方法 */
protected void paint(Graphics g) {
//将背景涂白
g.setColor(0x00FFFFFF);
g.fillRect(0, 0, getWidth(), getHeight());
//画蓝
g.drawImage(imgb,0,0,20);//画背景图
for(int i=0;i<getWidth();i+=getWidth()/8)
{
g.setClip(i,0,j,getHeight());//设置透视口
g.drawImage(logo,0,0,20);
}
}
class St extends TimerTask
{
public void run()
{
if (j>0)
{
j--;
repaint();
} else
{
b.cancel();
}
}
}
}
一个高手的评价:
第一种不可取
我到是觉得用MIDP 2.0的drawRGB()比较好 在底图上覆盖一个遮罩 然后模拟百叶窗的渐变效果 直到最后透明