在现代,摒弃传统的会话方式,很多的图形广告或游戏采用了[逐字打印]的效果来展示文字,当然,这样做的目的无非是为了突出内容或吸引眼球。

但是这种实现方式却是值得借鉴的,以下,我给出一个JAVA实现的简单用例,需要者可以自行扩充。

代码实现:

package org.test;

import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.p_w_picpath.BufferedImage;

import org.loon.framework.game.helper.ImageHelper;

/** *//**
* <p>
* Title: LoonFramework
* </p>
* <p>
* Description:JAVA实现对话逐字打印(由Loonframework提供)
* </p>
* <p>
* Copyright: Copyright (c) 2007
* </p>
* <p>
* Company: LoonFramework
* </p>
*
* @author chenpeng
* @email:[email]ceponline@yahoo.com.cn[/email]
* @version 0.1
*/

public final class WriterType extends Panel implements Runnable {
        // 最大对话数
        private int _MAX_COUNT = 10;

//间隔标记
        private char _flag='|';
        
        private Image _screen;

private Graphics _bg;

private Thread _L_WriterType;

private static Color _L_fClr;

private static Color _L_bClr;

private static String _M_Text[];

private int _S_COUNT;

private Font _L_TTF;

private int _L_Speed;

private int _L_Delay;

private String _C_Text[];

private static int _L_COUNT;

private static int _F_COUNT;
        
        private static int _T_COUNT;

private static int _N_Text;

private String _FontName;

private final static int _WIDTH = 500;

private final static int _HEIGHT = 375;

private static int _FontStyle;

private static int _FontSize;

private static    Image _back = null;

/** *//**
         *
         */
        private static final long serialVersionUID = 1L;

private boolean _isRun;

/** *//**
         * 析构函数,注入背景图,循环显示的文字数组,速度,延迟
         * @param img
         * @param strContent
         * @param speed
         * @param delay
         */
        public WriterType(Image img,String[] strContent, int speed, int delay) {
                init(img,strContent, speed, delay);
        }

private WriterType() {

}

public void init(Image img,String[] strContent, int speed, int delay) {
                //初始背景色
                setBackground(Color.BLACK);
                // 原始对话信息
                _M_Text = new String[_MAX_COUNT];
                // 缓存对话信息
                _C_Text = new String[_MAX_COUNT];

_back=img;
                _FontName = "宋体";

_FontStyle = 0;

_FontSize = 15;

_L_TTF = new Font(_FontName, _FontStyle, _FontSize);
                _L_bClr = Color.BLACK;
                _L_fClr = new Color(250, 250, 250);

int length = strContent.length;

// 循环次数
                _N_Text = strContent.length - 1;

// 直接copy String数组
                System.arraycopy(strContent, 0, _M_Text, 0, length);

//速度及延迟设定
                _L_Speed = speed;
                _L_Delay = delay;
                
                //缓存区域
                _screen = new BufferedImage(_WIDTH, _HEIGHT, 1);
                _bg = _screen.getGraphics();

//开启线程
                        _isRun = true;
                        _L_WriterType = new Thread(this);
                        _L_WriterType.start();
                
        }

/** *//**
         * 停止线程
         *
         */
        public void stop() {
                _S_COUNT = 0;
                _L_COUNT = 0;
                _F_COUNT = 0;
                if (_L_WriterType != null) {
                        _isRun = false;
                        _L_WriterType = null;
                }
        }

/** *//**
         * 绘制图形
         */
        public void paint(Graphics g) {
                _bg.setColor(_L_bClr);
                _bg.fillRect(0, 0, _WIDTH, _HEIGHT);
                _bg.setColor(_L_fClr);
                _bg.setFont(_L_TTF);
                _bg.drawImage(_back, 0, 0, this);
                for (int i = 0; i <= _L_COUNT; i++) {
                        //转换当前字体top位置
                        Double top = new Double((double) _FontSize
                                        * (3.0D + 2.0D * (double) i));
                        if (_C_Text[i] != null) {
                                _bg.drawString(_C_Text[i], 50, top.intValue());
                        }
                }

g.drawImage(_screen, 0, 0, this);
        }

/** *//**
         * 图形变更
         */
        public void update(Graphics g) {
                paint(g);
        }

/** *//**
         * 重新开始
         *
         */
        private void begin() {
                //清除所有缓存数据。
                for (int i = 0; i < _C_Text.length; i++) {
                        _C_Text[i] = null;
                }
                _F_COUNT = 0;
                _S_COUNT = 0;
                _L_COUNT = 0;
                _T_COUNT++;
                if (_T_COUNT > _N_Text) {
                        _T_COUNT = 0;
                }
                repaint();
        }

public void run() {
                while (_isRun) {
                        try {

//字符串累加
                                _S_COUNT++;
                                //当字符串完成整段对话时
                                if (_S_COUNT == _M_Text[_T_COUNT].length()) {
                                        _C_Text[_L_COUNT] = _M_Text[_T_COUNT].substring(_F_COUNT,
                                                        _S_COUNT);
                                        begin();
                                        Thread.sleep(_L_Delay);
                                        repaint();
                                }
                                //比对标识设定缓存对话
                                if (_M_Text[_T_COUNT].charAt(_S_COUNT) != _flag) {
                                        _C_Text[_L_COUNT] = _M_Text[_T_COUNT].substring(_F_COUNT,
                                                        _S_COUNT)
                                                        + "_";
                                } else {
                                        _C_Text[_L_COUNT] = _M_Text[_T_COUNT].substring(_F_COUNT,
                                                        _S_COUNT);
                                }
                                //用以分辨是否转化对话组时的不同延迟
                                boolean shortSleep;
                                //当'|'标识存在时执行
                                if (_M_Text[_T_COUNT].charAt(_S_COUNT) == _flag) {
                                        _L_COUNT++;
                                        _S_COUNT++;
                                        _F_COUNT = _S_COUNT;
                                        shortSleep = true;
                                } else {
                                        shortSleep = false;
                                }
                                //刷新
                                repaint();
                                //判断速度
                                if (!shortSleep) {
                                        Thread.sleep(_L_Speed);
                                } else {
                                        Thread.sleep(10 * _L_Speed);
                                }
                        } catch (InterruptedException e) {
                                stop();
                        }
                }
        }
        
        public int getMaxCount() {
                return _MAX_COUNT;
        }

public void setMaxCount(int max_count) {
                _MAX_COUNT = max_count;
        }

public static void main(String[] args) {
                String[] abracadabra = new String[] {
                                "身为剑体,|钢铁之血灼璃之心.|手创千剑,身经百战;|无一败绩,无一知己.|常一人自醉于剑丘之巅;|此生亦无任何意义;|故此身,定为无限剑成;|故此命,定为无限剑制.",
                                "I am the bone of my sword;|Steel is my body, and fire is my blood.|I have created over a thousand blades.|Have withstood pain to create many weapons.|Yet,those hands will never hold anything.|So as I pray, unlimited blade works." };
                Frame frm = new Frame();
                frm.setTitle("Java图形程序中的对话逐字显示(由Loonframework提供)");
                frm.setSize(_WIDTH, _HEIGHT + 20);
                frm.setResizable(false);
                frm.add(new WriterType(ImageHelper
                                .loadImage("d:/back.jpg", true),abracadabra,50,5000));
                frm.setVisible(true);
        }

}

本例自动循环String数组中所有数据,每行显示对话由'|'标记分割,背景图如下:

效果图1:

效果图2:

PS:ImageHelper只是一个图片加载用类,完全可以用ImageIcon或者ImageIO替代,原来的博客来有人问,兄弟在这声明一下。

转载于:https://blog.51cto.com/cping1982/116714

Java实现动画逐字打印相关推荐

  1. java怎么打印进制,java编程思维_007打印二进制,八进制,十六进制

    java编程思想_007打印二进制,八进制,十六进制 package wzs.test2; //打印二进制,八进制,十六进制 public class Test { public static voi ...

  2. java sheet 打印区域设定,如何使用Java设置电子表格的打印区域。(How to set the print area of a spreadsheet using Java.)...

    如何使用Java设置电子表格的打印区域.(How to set the print area of a spreadsheet using Java.) 问题描述 (Problem Descripti ...

  3. java类中声明log对象_用于Android环境,java环境的log打印,可打印任何类型数据

    LogXixi 用于Android环境,java环境的log打印,可打印任何类型数据,根据android项目环境debug环境自动打开,release环境自动关闭android环境log打印,规范be ...

  4. 如何用java制作动画_如何制作动画(java实现动画的代码)

    如何制作动画(java实现动画的代码)内容如下 回答一:AE用于制作mg动画,操作确实有些复杂,技术要求也高,但不得不承认它是个神器,可以创建各种吸引人的动态图形和视觉效果 当然,现在网上也有一些比较 ...

  5. JAVA练习:利用JAVA基本语句实现打印日历

    已知1900年1月1日是星期一,要求打印输入年月的日历. 输出结果格式: 日    一    二    三    四    五    六                                 ...

  6. java 批量打印_用java怎样实现批量打印

    展开全部 下面是实现Java批量打印功能的具体工具类,其中的Info类和UserClass为具体的快递面单中要打印的信息e68a8462616964757a686964616f313333633839 ...

  7. 第五章 如何使用java中的线程打印偶数和奇数

    你有两个线程.您需要使用一个线程打印奇数,使用另一个线程打印偶数.您需要以自然顺序打印最多 MAX. 例如: 如果 MAX 为 10,则需要打印: 1 2 3 4 5 6 7 8 9 10 所以 1 ...

  8. Java用for循环打印99乘法表

    Java用for循环打印99乘法表 ##Java用for循环打印99乘法表 public static void main(String[] args) {for(int i = 9;i >0; ...

  9. Java教程:Jasper-pdf打印类

    Java教程:Jasper-pdf打印类 import net.sf.jasperreports.engine.*; import net.sf.jasperreports.engine.data.J ...

最新文章

  1. GPU自动调度卷积层
  2. 如何进行机器学习框架选择
  3. js里面字符数字和数字相加_「译」5 个奇怪的只会在 JS 里才发生的趣事
  4. CF1322C:Instant Noodles
  5. AT3950-[AGC022E]Median Replace【贪心,dp】
  6. .bin 文件用excel文件打开_用python读Excel文件
  7. nohup的程序能不能再转到前台查看啊?_职场:为何酒店前台工资低还要上通宵,却还有很多女孩愿意做...
  8. bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线(线段树扫描线)
  9. 《Splunk智能运维实战》——2.8 列出浏览次数最多的产品
  10. 【Java】Java速成
  11. 正点原子T100智能焊台体验,顺便咱们来说说它的软件菜单、界面切换如何来实现?
  12. 计算垂直平面与三维线段交点
  13. Microsoft CRM 2016 IFD配置
  14. navcat导入mdf数据库文件教程
  15. 计算机中心述职报告诉,信息中心主任述职报告范文(2)
  16. U2-Net: Going Deeper with Nested U-Structure for Salient Object Detection|环境搭建|人物素描 测试 简记 |
  17. 支付宝福卡破解——咻一咻的ui怎么实现
  18. 中国石油大学北京计算机保研,中国石油大学(北京)地球物理与信息工程学院(专业学位)计算机技术保研细则...
  19. 车易加加油优惠卡_丰田Supra GRMN或2023年发布可 能搭载宝马3.0T发动机
  20. 【JAVASCRIPT】jquery实现图片笼罩效果

热门文章

  1. windows系统 安装MongoDB
  2. 61.新的开始(最小生成树)
  3. VMware 6.5下载地址及序列号(转,备用)
  4. 在中国,真正达到月收入1万以上的有多少
  5. “新基建”横空出世,9本书助你把握7+2大领域风口
  6. pc css框架,PC端框架—semantic ui
  7. 电信业务分类目录_第五大运营商!中信网络获基础电信业务牌照
  8. qt 中使用openssl_openSSL漏洞致使SSL证书安全配置评级F
  9. 再有人问你MySql 的隔离级别是什么,就把这篇文章发给他!
  10. 教你彻底学会Java序列化和反序列化