`

SWT Image闪屏问题

    博客分类:
  • SWT
阅读更多
转载:http://blog.csdn.net/chen09/article/details/2254198

Image Show by SWT
2008-04-06 02:34 548人阅读 评论(0) 收藏 举报
在做一个SWT的通用DB(jdbc)工具时,为了在主画面上加个logo,用上了俺家猫猫狗狗的照片。为了展示出这些照片,这个工具成了一个副产品。

SWT的image功能是俺以前没有碰过的,第一次用的时候碰到了不少问题。比如说闪屏,比如说淡入淡出的实现。

说实话,现在的淡入淡出感觉比较完美——前图的淡出和后图的淡入非常连贯。但是这也只是个偶然的bug造成的结果,并不是俺一开始就希望得到的结果,一开始,俺希望是白淡入,黑淡出,再白淡入。最后,黑淡出并没有实现,有些遗憾。

淡入淡出功能的实现,主要是设置imagedata的alphaData。研究alphaData的时候顺便也看一点mask的文档,用mask似乎可以实现不规则窗口,以后再好好研究一下。

闪屏的问题,一直想用双缓存去解决,最后画图用的canvas只要设置成SWT.NO_BACKGROUND就OK了,于是双缓存也没有去实现。其实,双缓存也试过,不知道是俺写得不对,还是别的什么原因,双缓存也不能解决非SWT.NO_BACKGROUND的闪屏问题。



package per.chenxin.test;

import java.io.IOException;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class ImageTest {
    public ImageTest imageTest;
    public Display display;
    public Canvas canvas;
    Util util = null;
    ImageData imageData = null;
    byte[] alphaData = null;
    public int fade = 0;

//    public boolean bMouseFlg = false;
//    public int intMouseX = -1;
//    public int intMouseY = -1;
    FadeThread fadeThread = null;
    public boolean isFirst = true;

    public ImageTest() throws IOException {
        imageTest = this;
        util = Util.getInstance();
        imageData = new ImageData(util.getInputStream());
        alphaData = new byte[imageData.data.length];
        imageData.alphaData = alphaData;
    }

    public void open() {
        display = Display.getDefault();
        final Shell shell = new Shell();
        shell.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(final DisposeEvent e) {
                try {
                    util.finalize();
                } catch (Throwable e1) {
                    e1.printStackTrace();
                }
            }
        });
        shell.setText("Image Show");
        //

        shell.open();

        canvas = new Canvas(shell, SWT.NO_BACKGROUND);
        canvas.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(final DisposeEvent e) {
                fadeThread.isActive = false;
            }
        });
        canvas.setBackground(new Color(display, 0, 0, 0));

//        canvas.addMouseMoveListener(new MouseMoveListener() {
//            public void mouseMove(final MouseEvent e) {
//                if ((e.x - intMouseX) * (e.x - intMouseX) + (e.y - intMouseY)
//                        * (e.y - intMouseY) > 10) {
//                    canvas.redraw();
//                    bMouseFlg = true;
//                    intMouseX = e.x;
//                    intMouseY = e.y;
//                }
//
//            }
//        });
        canvas.addMouseListener(new MouseAdapter() {
            public void mouseDown(final MouseEvent e) {
                try {
                    if (!util.next())
                        util = Util.getInstance();
                    fadeThread.isActive = false;
                    fadeThread = new FadeThread(imageTest);
                    new Thread(fadeThread).start();
                    fade = 0;
                    imageData = new ImageData(util.getInputStream());
                    for (int i = 0; i < alphaData.length; i++)
                        alphaData[i] = (byte) fade;
                    imageData.alphaData = alphaData;
                    fade = 0;
//                    bMouseFlg = true;
                    canvas.redraw();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        });
        canvas.addPaintListener(new PaintListener() {
            public void paintControl(final PaintEvent e) {
                try {
                    if (imageData == null) {
                        imageData = new ImageData(util.getInputStream());
                        alphaData = new byte[imageData.data.length];
                        imageData.alphaData = alphaData;
                        fade = 0;
                    }
                    canvas.setSize(imageData.width, imageData.height);
                    shell.setSize(imageData.width, imageData.height);
                    if (isFirst) {
                        ImageData imageData2 = (ImageData) imageData.clone();
                        for (int i = 0; i < imageData2.data.length; i++) {
                            imageData2.data[i] = (byte) 255;
                            imageData2.alphaData[i] = (byte) 255;
                        }
                        Image image = new Image(display, imageData2);
                        e.gc.drawImage(image, 0, 0);

                        isFirst = false;
                    } else {
                        Image image = new Image(display, imageData);
                        e.gc.drawImage(image, 0, 0);
                    }

//                    if (bMouseFlg) {
//                        e.gc.drawOval(intMouseX - 50, intMouseY - 50, 100, 100);
//                        bMouseFlg = false;
//                    }

                } catch (IOException e1) {
                    e1.printStackTrace();
                }

            }
        });
        canvas.setBounds(0, 0, imageData.width, imageData.height);
        shell.layout();

        fadeThread = new FadeThread(this);
        new Thread(fadeThread).start();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
    }

    /**
     * Launch the application
     *
     * @param args
     */
    public static void main(String[] args) {
        try {
            (new ImageTest()).open();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    static class FadeThread implements Runnable {
        ImageTest imageTest;
        public boolean isActive = false;

        public FadeThread(ImageTest imageTest) {
            this.imageTest = imageTest;
        }

        public void run() {
            isActive = true;
            while (imageTest.fade <= 255) {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                }
                if (imageTest.isFirst)
                    continue;
                if (!isActive)
                    break;
                for (int i = 0; i < imageTest.alphaData.length; i++)
                    imageTest.alphaData[i] = (byte) imageTest.fade;
//                if (imageTest.intMouseX >= 0 || imageTest.intMouseY >= 0) {
//                    imageTest.bMouseFlg = true;
//                }
                imageTest.display.asyncExec(new Runnable() {
                    public void run() {
                        imageTest.canvas.redraw();
                    }
                });
                imageTest.fade += 5;
            }
            isActive = false;
        }
    }

}



package per.chenxin.test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class Util {
    private static boolean isInited = false;
    private static Util util;
    private static String STR_IMAGE = "IMG_0328.zip";

    public byte[] bytesZipInputStream = null;
    public String strZipEntryName = null;

    private ZipInputStream zipInputStream = null;
    private ZipEntry zipEntry = null;

    private Util() throws IOException {
        zipInputStream = new ZipInputStream(new FileInputStream(STR_IMAGE));
        zipEntry = zipInputStream.getNextEntry();
        strZipEntryName = zipEntry.getName();
        zipEntry = zipInputStream.getNextEntry();
        if (zipEntry != null)
            strZipEntryName = zipEntry.getName();
    }

    public InputStream getInputStream() throws IOException {
        while (zipInputStream.available() == 0)
            next();
        return zipInputStream;
    }

    public boolean next() throws IOException {
        zipEntry = zipInputStream.getNextEntry();
        if (zipEntry == null) {
            try {
                finalize();
            } catch (Throwable e) {
                e.printStackTrace();
            }
            isInited = false;
            init();
            return false;
        } else
            strZipEntryName = zipEntry.getName();
        return true;
    }

    public static Util getInstance() throws IOException {
        Util.init();
        return util;
    }

    public static void init() throws IOException {

        if (!isInited) {
            util = new Util();
            isInited = true;
        }
    }

    static {
        try {
            init();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    protected void finalize() throws Throwable {
        if (zipInputStream != null) {
            if (zipEntry != null)
                zipInputStream.closeEntry();
            zipInputStream.close();
        }
    }

    public byte[] getBytesZipInputStream() throws IOException {
        bytesZipInputStream = new byte[zipInputStream.available()];
        zipInputStream.read(bytesZipInputStream);
        return bytesZipInputStream;
    }

    public String getStrZipEntryName() {
        return strZipEntryName;
    }
}

上面代码被注释掉的部分是在mouse移动时,在mouse处加个圆圈,是用来实现放大镜功能的。但是imagedata的构造还没有完全搞清楚,放大镜功能如何实现,也想到网上找找资料,所以先注释掉了。
分享到:
评论

相关推荐

    Android 8.0系统界面切换时闪屏问题

    ### Android 8.0系统界面切换时闪屏问题解析及解决方案 #### 一、问题背景与现象 在Android 8.0系统中,开发者可能会遇到一个常见问题:当应用程序进行界面切换时出现短暂的闪屏现象。这种现象不仅影响用户体验,...

    如何解决PPSSPP玩游戏的闪屏问题.mp4

    如何解决PPSSPP玩游戏的闪屏问题

    基于MFC的开发项目中出现的闪屏问题的解决方案

    基于MFC的开发项目中出现的闪屏问题的解决方案 在MFC(Microsoft Foundation Classes)应用程序开发中,美化窗口界面的一个常见问题是出现闪屏问题。闪屏问题是指在窗口界面中绘制背景图片或其他图形时,出现短时间...

    IntelPWMControl解决LED闪屏问题

    标题中的“IntelPWMControl”指的是一个专为解决LED闪屏问题设计的软件工具。这个工具主要针对使用低端LED显示屏的设备,尤其是笔记本电脑,因为这些设备的LED屏幕往往容易出现闪烁现象,对用户视力造成影响。 LED...

    winform 窗体 闪屏 彻底解决

    在Windows Forms(WinForm)开发中,用户可能会遇到一个常见的问题,那就是窗体在加载或刷新时出现“闪屏”现象。这个问题通常是由于系统在绘制窗体及其控件时的多帧重绘导致的,尤其是在控件数量较多时,这种现象...

    [js]打字效果[修复出现滚动条后,闪屏问题]

    本文将详细探讨如何使用JavaScript实现打字效果,并解决在有滚动条时的闪屏问题。 首先,我们来创建一个简单的打字效果。这通常涉及使用JavaScript的定时器(setTimeout或setInterval)来控制文字的逐个显示。以下...

    MPMoviePlayerController闪屏问题-未解决版

    然而,在实际使用过程中,开发者可能会遇到“闪屏”问题,这是一个常见的用户体验问题,它指的是在视频加载或者播放过程中屏幕出现短暂的闪烁或者黑屏现象。这个问题在"MPMoviePlayerController闪屏问题-未解决版"的...

    mysql登录闪屏问题解决办法.txt

    Mysql安装后打开MySQL Command Line Client闪退解决方法 //MySQL的启动方法,先在DOS下切换到mysql的安装目录...再然后在mysql登录界面输入用户名和命令即可//可以不用输入用户名和密码(可以解决闪屏问题) 步骤:

    解决重绘时候闪屏问题的实例程序

    在计算机图形学和用户界面设计中,"闪屏"是一个常见的问题,特别是在应用程序进行重绘时。这通常表现为屏幕上的内容快速闪烁或者不连续的变化,影响用户体验。本实例程序主要针对这个问题提供解决方案,旨在帮助...

    解决VC#中ListView闪屏的问题

    为了解决ListView闪屏问题,我们可以采取以下几种方法: 1. **双缓冲技术**:双缓冲是一种优化图形显示的技术,通过在内存中先完成所有绘制,然后一次性绘制到屏幕上,避免了多次绘制导致的闪烁。在C#中,可以...

    金山词霸2005闪屏补丁

    然而,随着软件的使用,部分用户可能会遇到“闪屏”问题,这可能是由于某些系统兼容性或者程序内部冲突导致的。为了解决这个问题,开发者特别推出了“金山词霸2005闪屏补丁”,以优化用户体验。 闪屏补丁的主要作用...

    联想笔记本掉电闪屏问题解决

    这个问题一直困扰了我好好久也没能解决,如今顺利的解决了,还是很开心的,也希望能帮忙同样有这个问题的朋友也能解决它.

    对话框中绘图,解决闪屏问题

    然而,在动态更新这些图形时,可能会遇到“闪屏”问题,即在画面刷新过程中短暂显示未完成的状态,造成用户体验不佳。为了解决这个问题,开发者通常会采用双缓存绘图技术。 双缓存绘图是一种优化策略,它将绘图操作...

    闪屏制作相关知识

    本文将深入探讨闪屏制作的关键知识点,特别是针对开发过程中可能遇到的问题进行详细解析。 #### 闪屏的基本概念与作用 闪屏通常由静态图片或动画组成,用于展示应用的品牌形象或吸引用户的注意。它的主要作用有两...

    详解使用双缓存解决Canvas clearRect引起的闪屏问题

    今天用 canvas 做 H5 的时候遇到了闪屏问题。闪烁效果如下图:   问题简介 功能简介 H5 该部分的功能为:通过点击二级菜单,切换图片的遮罩或者更换背景。 因为功能简单,所以用了原生 canvas 实现这个功能。但在...

    C#彻底解决listview的闪屏问题.doc

    为了解决这个问题,我们需要采用一种称为“双缓冲”的技术。 双缓冲是一种优化图形渲染的技术,通过在内存中先绘制整个图像,然后再一次性将完成的图像显示到屏幕上,从而避免了屏幕闪烁。在C#中,我们可以通过对...

    电脑显示器闪屏怎么回事 电脑显示器闪屏解决方法【详细介绍】.docx

    5. 显示卡驱动问题:如果显示卡驱动出了问题,也可能会导致显示器闪屏。 那么,如何解决电脑显示器闪屏问题呢?下面我们将详细介绍几种解决方法: 一、调整显示器的刷新频率:如果显示器的刷新频率太低,可能会...

    启动闪屏窗体/设置闪屏窗体

    在C/S(Client/Server)架构的软件开发中,启动闪屏窗体和设置闪屏窗体是常见的功能,主要用于提升用户体验,展示品牌形象,以及在应用程序加载时提供一个过渡效果。闪屏窗体通常是在软件启动初期显示的一个短暂窗口...

    模仿Eclipse的闪屏

    【Eclipse 闪屏】是一种启动时展示的短暂动画效果,常见于许多应用程序,包括集成开发环境(IDE)如Eclipse。这个效果不仅为用户提供了一种视觉反馈,表明程序正在加载,同时也为软件增添了品牌特色。在本文中,我们...

    闪屏窗口源代码闪屏窗口源代码

    8. **兼容性与性能优化**:为了保证在不同设备和操作系统版本上的表现,需要考虑兼容性问题。同时,优化绘制和动画的性能,避免闪屏窗口导致应用程序启动延迟。 通过理解和掌握以上知识点,开发者可以灵活地设计和...

Global site tag (gtag.js) - Google Analytics