我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层上显示图像我们才能看到。现在,我需要创建一个虚拟的、看不见但是可以在上面画图(比如说画点、线)的OSD层,我称之为offscreen(后台缓冲区)。这个offscreen存在于内存中,我们在上面画图,这个offscreen上面的东西可以显示在OSD层上,需要一个创建这个offscreen的函数,返回这个offscreen的句柄(整型
指针)、宽度、高度、指向新建offscreen
数据缓冲区的指针,该缓冲区是一个在函数外创建的offscreen的数据缓冲区,大小是offscreen的高度*宽度*每个像素点数据的大小。闪烁是图形编程的一个常见问题。需要多重复杂绘制操作的图形操作会导致呈现的图像闪烁或具有其他不可接受的外观。双缓冲的使用解决这些问题。双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。因为在
屏幕上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁
上代码:
import javax.swing.*;
import java.swt.*;
public class Test extends JFrame
{
private BufferedImage image = new BufferedImage(600,500,
BufferedImage.TYPE_INT_ARGB);
private Graphics g = image.getGraphics();
private int preX = -1;
private int preY = -1;
private DrawCanvas dc;
public Test(){
this.initialize();
}
public void initialize(){
image.fillRect(0,0,600,500);
this.setTitle("画板");
this.setSize(600,500);
this.setDefalutCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.add(dc);
dc.addMouseMotionListener(new MouseMotionListener(){
public void MouseDragged(MouseEvent e){
if(preX < 0 && preY < 0){
preX = e.getX();
preY = e.getY();
}
g.setColor(Color.red);
g.drawLine(preX,preY,e.getX(),e.getY());
dc.repaint();
}
public void MouseMoved(MouseEvent e){
preX = -1;
preY = -1;
}
});
}
public static void main(String args[]){
}
class DrawCanvas extends Canvas{
public void update(Graphics g){
Image i = this.createImage();
Graphics g2 = i.getGraphics();
paint(g2);//把图画到缓存中去
g.drawImage(i,0,0,null);//一次性显示出来
}
public void paint(Graphics g){
g.drawImage(image,0,0,null);
}
}
}