📄 logopanel.java
字号:
import java.awt.*;
import javax.swing.*;
/**
* Logon动画面板
* @author fantasyer
* @version 1.0
*/
public class LogoPanel extends JPanel implements Runnable
{
//String text = "Fantasyer Studio"; //显示的文字
private String text = "幻想工作室"; //显示的文字
private char[] eachChar; //单个字符
private int[] startPosition; //字符的起始位置
private int[] finalPosition; //字符的最终位置
private int charSpace; //字符间隔
private int sleepTime; //字体动画延迟时间
private boolean[] isMoving; //单个字符是否移动
private boolean isTextOver; //整个字体移动是否结束
private boolean isFadeIn; //淡入效果是否结束
private int textWidth; //字体的宽度
private int width; //面板的宽度
private int height; //面板的高度
private int[] red, green, blue; //单个字符的颜色
private Image img; //背景图片
private Thread thread; //动画线程
private final int TEXT_OUT = 1; //动画状态
private final int FADE_IN = 2;
private final int BACK_IMG = 3;
private int step = TEXT_OUT;
private int r = 0, g = 0, b = 0; //背景颜色
/**
* 构造函数加载图片、初始化相关变量
*/
LogoPanel()
{
setPreferredSize(new Dimension(Utility.SCREEN_WIDTH,Utility.SCREEN_HEIGHT));
//初始化各个属性
width = (int)this.getPreferredSize().getWidth();
height = (int)this.getPreferredSize().getHeight();
Font f = new Font("Courier", Font.BOLD, 28);
FontMetrics fm = this.getFontMetrics(f);
textWidth = fm.stringWidth(text);
eachChar = new char[text.length()];
for (int i = 0; i<text.length(); i++)
{
eachChar[i] = text.charAt(i);
}
int leftChar = (width-textWidth)/2;
int s = leftChar+fm.stringWidth(text.substring(0, text.length()/2));
startPosition = new int[text.length()];
for (int i = 0; i<text.length(); i++)
{
startPosition[i] = s;
}
charSpace = 14;
finalPosition = new int[text.length()];
finalPosition[0] = leftChar;
for (int i = 1; i<text.length(); i++)
{
finalPosition[i] = finalPosition[i-1]+fm.charWidth(text.charAt(i-1));
}
isMoving = new boolean[text.length()];
for (int i = 0; i<text.length(); i++)
{
isMoving[i] = true;
}
isMoving[text.length()/2] = false;
isTextOver = false;
sleepTime = 30;
red = new int[text.length()];
green = new int[text.length()];
blue = new int[text.length()];
for (int i = 0; i<text.length(); i++)
{
red[i] = 255;
green[i] = 0;
blue[i] = 0;
}
isFadeIn = false;
thread = new Thread(this);
thread.start();
}
/**
* 在面板上绘制背景图片
* @param g 用于绘图的对象
*/
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.black);
g.fillRect(0, 0, width, height);
if (step==TEXT_OUT)
{
g.setColor(Color.red);
g.setFont(new Font("Courier", Font.BOLD, 28));
for (int i = 0; i<text.length(); i++)
{
g.drawChars(eachChar, i, 1, startPosition[i]-1, height/2);
float leftPadding = (float)(width-textWidth)/2;
int redVal = (int)( ((Math.abs((float)this.width/2-(float)startPosition[i])) / ((float)this.width/2-leftPadding))*255.0 );
Color textColor = new Color(redVal, 75, 250);
g.setColor(textColor);
red[i] = textColor.getRed();
green[i] = textColor.getGreen();
blue[i] = textColor.getBlue();
//阴影
g.drawChars(eachChar, i, 1, startPosition[i], height/2);
}
}
else if (step==FADE_IN)
{
g.setFont(new Font("Courier", Font.BOLD, 28));
for (int i = 0; i<text.length(); i++)
{
g.setColor(new Color(red[i], green[i], blue[i]));
g.drawChars(eachChar, i, 1, startPosition[i], height/2);
}
}
}
/**
* 负责动画的线程函数
*/
public void run()
{
//动画一 字体的变化
while (!isTextOver)
{
for (int i = 0; i<text.length(); i++)
{
if (!isMoving[i])
{
continue;
}
else
{
if (startPosition[i]<finalPosition[i])
{
startPosition[i]++;
}
else if (startPosition[i]>finalPosition[i])
{
startPosition[i]--;
}
else
{
isMoving[i] = false;
}
}
}
int i = 0;
for (i = 0; i<text.length(); i++)
{
if (isMoving[i])
{
break;
}
}
if (i==text.length())
{
isTextOver = true;
}
try
{
Thread.sleep(12);
repaint();
}
catch (Exception e)
{
}
}
//动画二 字体淡出效果
step = FADE_IN;
while (!isFadeIn)
{
for (int i = 0; i<text.length(); i++)
{
if (red[i]>r)
{
red[i]--;
}
else if (red[i]<r)
{
red[i]++;
}
if (green[i]>g)
{
green[i]--;
}
else if (green[i]<g)
{
green[i]++;
}
if (blue[i]>b)
{
blue[i]--;
}
else if (blue[i]<b)
{
blue[i]++;
}
}
int j = 0;
for (j = 0; j<text.length(); j++)
{
if ((red[j]!=r)||(green[j]!=g)||(blue[j]!=b))
{
break;
}
}
if (j==text.length())
{
isFadeIn = true;
}
repaint();
}
//通知主界面开场动画已结束
synchronized(Game.getInstance())
{
Game.getInstance().notify();
}
}//run
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -