zoukankan      html  css  js  c++  java
  • e674. 创建并绘制加速图像

    Images in accelerated memory are much faster to draw on the screen. This example demonstrates how to take an image and make an accelerated copy of it and then use it to draw on the screen.

    The problem with images in accelerated memory is that they can disappear at any time. The system is free to free accelerated memory at any time. Such images are called volatile images. To deal with this issue, it is necessary to check whether a volatile image is still valid immediately after drawing it. If it is no longer valid, it is then necessary to reconstruct the image and then attempt to draw with it again.

    This example implements a convenient method for drawing volatile images. It automatically handles the task of reconstructing the volatile image when necessary.

        // This method draws a volatile image and returns it or possibly a
        // newly created volatile image object. Subsequent calls to this method
        // should always use the returned volatile image.
        // If the contents of the image is lost, it is recreated using orig.
        // img may be null, in which case a new volatile image is created.
        public VolatileImage drawVolatileImage(Graphics2D g, VolatileImage img,
                                               int x, int y, Image orig) {
            final int MAX_TRIES = 100;
            for (int i=0; i<MAX_TRIES; i++) {
                if (img != null) {
                    // Draw the volatile image
                    g.drawImage(img, x, y, null);
        
                    // Check if it is still valid
                    if (!img.contentsLost()) {
                        return img;
                    }
                } else {
                    // Create the volatile image
                    img = g.getDeviceConfiguration().createCompatibleVolatileImage(
                        orig.getWidth(null), orig.getHeight(null));
                }
        
                // Determine how to fix the volatile image
                switch (img.validate(g.getDeviceConfiguration())) {
                case VolatileImage.IMAGE_OK:
                    // This should not happen
                    break;
                case VolatileImage.IMAGE_INCOMPATIBLE:
                    // Create a new volatile image object;
                    // this could happen if the component was moved to another device
                    img.flush();
                    img = g.getDeviceConfiguration().createCompatibleVolatileImage(
                        orig.getWidth(null), orig.getHeight(null));
                case VolatileImage.IMAGE_RESTORED:
                    // Copy the original image to accelerated image memory
                    Graphics2D gc = (Graphics2D)img.createGraphics();
                    gc.drawImage(orig, 0, 0, null);
                    gc.dispose();
                    break;
                }
            }
        
            // The image failed to be drawn after MAX_TRIES;
            // draw with the non-accelerated image
            g.drawImage(orig, x, y, null);
            return img;
        }
    

    Here's a component that uses the method:

        // Declare a component that draws a volatile image
        class MyComponent extends Canvas {
            VolatileImage volImage;
            Image origImage = null;
        
            MyComponent() {
                // Get image to move into accelerated image memory
                origImage = new ImageIcon("image.gif").getImage();
            }
        
            public void paint(Graphics g) {
                // Draw accelerated image
                int x = 0;
                int y = 0;
                volImage = drawVolatileImage((Graphics2D)g, volImage, x, y, origImage);
            }
        }
    
    Related Examples
  • 相关阅读:
    ios开发UI篇—Kvc简单介绍
    iOS开发UI篇—xib的简单使用
    剥开比原看代码08:比原的Dashboard是怎么做出来的?
    剥开比原看代码07:比原节点收到“请求区块数据”的信息后如何应答?
    剥开比原看代码06:比原是如何把请求区块数据的信息发出去的
    剥开比原看代码05:如何从比原节点拿到区块数据?
    剥开比原看代码04:如何连上一个比原
    剥开比原看代码03:比原是如何监听p2p端口的
    剥开比原看代码02:比原启动后去哪里连接别的节点
    剥开比原看代码01:初始化时生成的配置文件在哪儿
  • 原文地址:https://www.cnblogs.com/borter/p/9575579.html
Copyright © 2011-2022 走看看