使用双缓冲技术解决动画播放闪烁问题
来源:互联网 发布:孙子兵法华杉 知乎 编辑:程序博客网 时间:2024/06/05 19:43
双缓冲技术主要就是使多张图像在后台绘制到一张图像上,然后把这一张图像绘制到显示屏幕上来解决多次绘制导致的屏幕闪烁
就比如如下的方法,传入系统屏幕的画笔g,然后在后台上创建一个和屏幕一样大的图像iBuffer,再获得iBuffer的画笔gBuffer,
通过画笔gBuffer把图像画到iBuffer上面,这就是在后台完成图像的绘制,最终调用系统的画笔g把后台绘制完成的图像画到屏幕上
/** * 绘制方法 * 采用双缓冲技术 */public void onDrow(Graphics g) {//判断后台图像是否为空 if(iBuffer == null){ //如果为空,则创建一个和当前界面一样大小的缓冲图像,再取得这个图像的画布对象gBuffer iBuffer = createImage((int)this.getSize().getWidth(),(int)this.getSize().getHeight()); }//获得该图像的画笔gBuffer = iBuffer.getGraphics(); //用背景色填充图像(清理画面) //一般如果有背景图的话,本段就可以不用了gBuffer.setColor(getBackground()); gBuffer.fillRect(0, 0, (int)this.getSize().getWidth(), (int)this.getSize().getHeight()); gBuffer.drawImage(image.getSubimage(ax, ay, w, h), 1000, 300, 50, 75, null);//在界面上直接画出缓冲图像 g.drawImage(iBuffer,0,0,this); }
最终贴上完整代码,其中的图片可以酌情换成其他4*4的人物行走素材图片
package com.ljxt.SwingTest;import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Image;import java.awt.Toolkit;import java.awt.image.BufferedImage;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.JFrame;public class SwingTest extends JFrame{public static int count = 0;public static int screenWidth;public static int screenHeight;public static BufferedImage image;boolean isRun = true;Image iBuffer;Graphics gBuffer;static int ax = 0;int ay = 0;int w;int h;public static void main(String[] args) {//初始化设置SwingTest swingTest = new SwingTest(true);//显示窗体swingTest.setVisible(true);//开始循环绘制swingTest.action();}/** * 开启线程 */public void action() {new Thread(run).start();}/** * 绘制图像 */public void paint(Graphics g) {//调用绘制方法onDrow(g);}/** * 绘制方法 * 采用双缓冲技术 */public void onDrow(Graphics g) {//判断后台图像是否为空 if(iBuffer == null){ //如果为空,则创建一个和当前界面一样大小的缓冲图像,再取得这个图像的画布对象gBuffer iBuffer = createImage((int)this.getSize().getWidth(),(int)this.getSize().getHeight()); }//获得该图像的画笔gBuffer = iBuffer.getGraphics(); //用背景色填充图像(清理画面) //一般如果有背景图的话,本段就可以不用了gBuffer.setColor(getBackground()); gBuffer.fillRect(0, 0, (int)this.getSize().getWidth(), (int)this.getSize().getHeight()); gBuffer.drawImage(image.getSubimage(ax, ay, w, h), 1000, 300, 50, 75, null);//在界面上直接画出缓冲图像 g.drawImage(iBuffer,0,0,this); }/** * 读取图片 */public void getImage() {if(image == null) {try {image = (BufferedImage)(ImageIO.read(new FileInputStream("image/人物行走.jpg")));//获得图片截取的大小w = image.getWidth() / 4;h = image.getHeight() / 4;} catch (FileNotFoundException e1) {e1.printStackTrace();} catch (IOException e1) {e1.printStackTrace();}}}/** * 更新画面 */public void update(Graphics g){ paint(g); }/** * 获得屏幕大小 */public void getScreen() {Toolkit toolkit = Toolkit.getDefaultToolkit();Dimension dimension = toolkit.getScreenSize();screenWidth = (int) dimension.getWidth();screenHeight = (int) dimension.getHeight();}/** * 初始化窗体设置 */public SwingTest(boolean actMoving) {getImage();getScreen();setTitle("无限恐怖v0.1");setSize(screenWidth, screenWidth);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设定背景为黑色setBackground(Color.BLACK);}/** * 由线程来控制绘制频率 */Runnable run = new Runnable() {@Overridepublic void run() {while (true) {if(SwingTest.count % 4 == 0) {ay = SwingTest.count / 4 * 75;ax = 0;}repaint();try {Thread.sleep(1000 / 10);} catch (Exception e) {}ax += w;SwingTest.count++;if(SwingTest.count == 4) {SwingTest.count = 0;}}}};}
阅读全文
0 0
- 使用双缓冲技术解决动画播放闪烁问题
- 应用双缓冲技术解决画面闪烁的问题
- 解决J2ME画面闪烁的问题--双缓冲技术
- 应用双缓冲技术解决画面闪烁的问题
- Java Swing 双缓冲技术解决图像闪烁问题
- 双缓冲技术解决MFC重绘闪烁问题
- 如何使用 GDI+ 双缓冲 解决绘图闪烁问题
- 使用 GDI+ 双缓冲 解决绘图闪烁问题
- 双缓冲技术解决屏幕刷新闪烁
- 利用双缓冲技术解决图像闪烁
- 双缓冲解决绘制图象闪烁问题
- MFC双缓冲解决闪烁问题
- GDI+双缓冲解决图像闪烁问题
- MFC双缓冲解决闪烁问题
- 双缓冲DoubleBuffered解决闪烁问题
- C# 解决双缓冲闪烁问题
- 应用双缓冲技术解决J2ME中的画面闪烁的问题
- 应用双缓冲技术解决J2ME中的画面闪烁的问题
- HDU 3038 How many answer are wrong (并查集)
- 最全的mysql 5.7.13 安装配置方法图文教程(linux)
- 重载赋值运算符(c++)
- synchronized的JVM底层实现
- R中ifelse、which、%in%的用法
- 使用双缓冲技术解决动画播放闪烁问题
- C++学习笔记之编程应当注意的问题
- Python操作Mysql数据库
- 每日一题——链表相交问题
- 216. Combination Sum III
- Android--Socket通信
- bingo-培训——用户体验
- 盘点8种CSS实现垂直居中水平居中的绝对定位居中技术
- ubunut python2 和python 3 同时存在 pip指向问题