<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java桌面技術(shù)

    Java Desktop Technology

    常用鏈接

    統(tǒng)計(jì)

    友情連接

    最新評(píng)論

    《FilthyRichClients》讀書(shū)筆記(二)-讓Swing正確顯示Gif

    利用gif圖片制作簡(jiǎn)單動(dòng)畫(huà)是常用的渲染手段,swing雖然支持gif圖片格式并可以自動(dòng)地實(shí)現(xiàn)動(dòng)畫(huà)效果。
    通常最簡(jiǎn)單地將gif圖片放到swing組件上是調(diào)用JButton或JLabel的setIcon(Icon icon)方法。
    還有一種方法是重寫(xiě)paintComponent(Graphics g)或paint(Graphics g)方法。例如
    public class ShowGifPanel extends JPanel{
        ImageIcon image = new ImageIcon("/root/opt/loading.gif");

        @Override
        public void paint(Graphics g) {
            g.drawImage(image.getImage(), 0, 0, this);
        }
    }
    通過(guò)上述方法呈現(xiàn)如下3個(gè)gif。



    但是事實(shí)情況卻是:不要企圖通過(guò)這樣簡(jiǎn)單的處理達(dá)到理想的效果。如果你這樣做的話(huà)?cǎi)R上會(huì)發(fā)現(xiàn)gif的刷新率往往非常快,看上去gif圖片楨刷新很快,或者應(yīng)該說(shuō)太快了。
    swing還提供了一種實(shí)現(xiàn)手段是設(shè)置一組相似的gif,通過(guò)輪循顯示來(lái)呈現(xiàn),通過(guò)下圖就明了了。

    這樣雖然可以呈現(xiàn),但是對(duì)于一個(gè)動(dòng)畫(huà)來(lái)說(shuō)就必須提供多個(gè)gif。對(duì)于占用空間和給美工的負(fù)擔(dān)都不利。

    如果你使用SWT呈現(xiàn)Gif,Eclipse提供了一個(gè)方案。
    http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet141.java?view=co
    其基本原理就是將Gif的各個(gè)楨輪循地顯示,如果你以這個(gè)程序運(yùn)行l(wèi)oading.gif,看上去還是很快,可以通過(guò)修改第131~137行之間的代碼來(lái)調(diào)節(jié)刷新率。這樣SWT就能完美實(shí)現(xiàn)處理Gif了。
    不幸的是,將SWT的那種方式移植到Swing中卻達(dá)不到很好的效果。在Swing中要想完美實(shí)現(xiàn)處理Gif需要額外的一些工作。

    首先需要對(duì)Gif這種圖片格式有一些基本認(rèn)識(shí)。
    第一:Gif由一系列Image組成,也就是楨,Gif動(dòng)畫(huà)就是連續(xù)地顯示這些楨,但是這還不夠。
    第二:無(wú)論某一時(shí)刻輪循到哪一楨,第1楨,總是要當(dāng)作背景畫(huà)出來(lái),而且第1楨也是所有楨當(dāng)中最長(zhǎng)最高的,它的尺寸也是整個(gè)Gif圖象的尺寸,位置從(0, 0)開(kāi)始,其余各楨可能只是描述與相臨各楨變化的部分,所以長(zhǎng)和高要小且不完整,起始位置是該楨相對(duì)整體背景的位置。(這點(diǎn)SWT也是這樣做的)
    第三:Gif動(dòng)畫(huà)連續(xù)顯示不一定是各個(gè)楨輪循單獨(dú)顯示,而是不僅僅顯示當(dāng)前該顯示的楨,還要向前追溯到"第一楨",從"第一楨"開(kāi)始到當(dāng)前應(yīng)該顯示的楨組成的連續(xù)一系列"楨簇",所以某一時(shí)刻單單顯示背景和當(dāng)前楨是不夠的,而是顯示背景和當(dāng)前"楨簇"。""楨簇""是我自己取的名字,而且我看SWT輪循的例子中并沒(méi)有用到"楨簇",而是傳統(tǒng)的單楨輪循。但是同樣的方法對(duì)Swing不奏效,現(xiàn)在我對(duì)此還不得其解。關(guān)于"第一楨",是和com.sun.imageio.plugins.gif.GIFImageMetadata類(lèi)的disposalMethod屬性有關(guān),在SWT中這個(gè)屬性是org.eclipse.swt.graphics.ImageData.disposalMethod。disposalMethod據(jù)我的研究是描述處理楨的方法,常見(jiàn)的disposalMethod取值有none(取值0,不處理)、Background(取值2,背景)兩種,所謂的當(dāng)前楨的"第一楨"就是向前追溯到最近的disposalMethod取值為2的那一楨的下一楨,也就是說(shuō)或者"第一楨"的前一楨的disposalMethod取值為2,或者"第一楨"就是Gif索引為2的楨,因?yàn)镚if的第1楨總要當(dāng)背景顯示。
    第四:楨的元數(shù)據(jù)在SWT中用org.eclipse.swt.graphics.ImageData類(lèi)封裝,在Swing中對(duì)應(yīng)的是com.sun.imageio.plugins.gif.GIFImageMetadata(可是截止到JDK6.0 u11,這個(gè)類(lèi)的版本號(hào)還是0.5,有些另人失望:(),可以通過(guò)次類(lèi)獲取到delayTime這個(gè)屬性,也就是下一楨的間隔時(shí)間,但是有很多Gif,這個(gè)值總是0,所以Swing顯示頻率相當(dāng)?shù)目臁?/p>

    以下是本人寫(xiě)的2個(gè)參考實(shí)現(xiàn),其中GifAnalysis.java是gif的分析工具,它將Gif的各個(gè)楨單獨(dú)拿出來(lái)分析比對(duì),并列出了上面提到的一些屬性。如下圖





    通過(guò)比較發(fā)現(xiàn)loading.gif各個(gè)楨的delayTime均為0,因此單純地將loading.gif設(shè)置為JLabel等組件的icon屬性效果必定會(huì)出問(wèn)題,可以通過(guò)美工解決。

    Gif.java是呈現(xiàn)gif的參考,需要留意構(gòu)造函數(shù)public Gif(File gifFile, int delayFactor),第二個(gè)參數(shù)是延時(shí)因子,數(shù)值越大每一楨的間隔就越長(zhǎng),對(duì)于loading.gif該值調(diào)節(jié)為105較為合適,而tt1.gif和javafx-loading-100x100.gif這個(gè)值應(yīng)該是10。
    參考代碼這里下載

    posted on 2008-12-07 20:36 sun_java_studio@yahoo.com.cn(電玩) 閱讀(42602) 評(píng)論(7)  編輯  收藏 所屬分類(lèi): NetBeans

    評(píng)論

    # re: 《FilthyRichClients》讀書(shū)筆記(二)-讓Swing正確顯示Gif[未登錄](méi) 2008-12-12 14:00 Matthew Chen

    swing 也可以很簡(jiǎn)單地實(shí)現(xiàn)gif動(dòng)畫(huà)繪制,同時(shí)試了一下JLabel和JButton,直接setIcon就可以了。

    public class ShowGifPanel extends JPanel{
    ImageIcon image = new ImageIcon("/root/opt/loading.gif");

    protected void paintComponent(Graphics g) {
    //記得調(diào)用超類(lèi)方法,還有容器的繪制應(yīng)該在這個(gè)方法里添加才對(duì)。
    super.paintComponent(g);
    g.drawImage(image.getImage(), 0, 0, this);
    }
    }
      回復(fù)  更多評(píng)論   

    # re: 《FilthyRichClients》讀書(shū)筆記(二)-讓Swing正確顯示Gif[未登錄](méi) 2008-12-12 14:14 Matthew Chen

    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.Graphics;

    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;

    import com.matthew.common.UIManagerUtil;

    public class GifDraw {

    private JFrame frame;

    /**
    * Launch the application
    *
    * @param args
    */
    public static void main(String args[]) {

    try {
    UIManagerUtil.setSystemLookAndFeel();
    GifDraw window = new GifDraw();
    window.frame.setVisible(true);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    /**
    * Create the application
    */
    public GifDraw() {
    initialize();
    }

    /**
    * Initialize the contents of the frame
    */
    private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 500, 375);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    final ImageIcon i = new ImageIcon("105.gif");
    final JPanel panel = new JPanel() {

    @Override
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(i.getImage(), 0, 0, this);
    }
    };
    panel.setLayout(null);
    frame.getContentPane().add(panel, BorderLayout.CENTER);

    final JPanel panel_1 = new JPanel();
    panel_1.setLayout(new FlowLayout());
    frame.getContentPane().add(panel_1, BorderLayout.NORTH);

    final JLabel label = new JLabel(i);
    label.setText("New JLabel");
    panel_1.add(label);

    final JButton button = new JButton(i);
    button.setText("New JButton");
    panel_1.add(button);

    }

    }
      回復(fù)  更多評(píng)論   

    # re: 《FilthyRichClients》讀書(shū)筆記(二)-讓Swing正確顯示Gif 2008-12-12 23:46 sun_java_studio@yahoo.com.cn(電玩)

    @Matthew Chen
    用loading.gif試過(guò)嗎?
    記住我提到的“但是事實(shí)情況卻是:不要企圖通過(guò)這樣簡(jiǎn)單的處理達(dá)到理想的效果。”  回復(fù)  更多評(píng)論   

    # re: 《FilthyRichClients》讀書(shū)筆記(二)-讓Swing正確顯示Gif[未登錄](méi) 2008-12-13 14:55 Matthew Chen

    試了一下,還真的不行...
    我之前只是用某個(gè)的gif動(dòng)畫(huà)  回復(fù)  更多評(píng)論   

    # re: 《FilthyRichClients》讀書(shū)筆記(二)-讓Swing正確顯示Gif 2008-12-16 12:46 電玩

    @Matthew Chen
    用GifAnalysis可以查看gif各frame的delayTime屬性,美工應(yīng)該知道如何更改這個(gè)值。  回復(fù)  更多評(píng)論   

    # re: 《FilthyRichClients》讀書(shū)筆記(二)-讓Swing正確顯示Gif[未登錄](méi) 2009-01-04 12:52 AllenME

    希望繼續(xù)發(fā)關(guān)于這本書(shū)的筆記。 看您的blog ,就不用看書(shū)了,哈哈  回復(fù)  更多評(píng)論   

    # re: 《FilthyRichClients》讀書(shū)筆記(二)-讓Swing正確顯示Gif[未登錄](méi) 2014-10-16 19:28 1

    很好  回復(fù)  更多評(píng)論   

    TWaver中文社區(qū)
    主站蜘蛛池模板: 最近免费视频中文字幕大全| 亚洲AV无码一区二区三区网址| 亚洲国产精品无码专区| 亚洲A∨精品一区二区三区| 免费中文字幕在线| 无码欧精品亚洲日韩一区夜夜嗨| 免费国产成人高清在线观看麻豆 | 亚洲精品日韩中文字幕久久久| 亚洲第一极品精品无码久久| 国产AV无码专区亚洲AV手机麻豆| 亚洲日韩VA无码中文字幕| 在线观看国产区亚洲一区成人| 成人午夜亚洲精品无码网站| 亚洲精品国产精品乱码视色| 亚洲国产精品无码久久久秋霞2| 亚洲国产精品无码久久一线| 久久亚洲AV成人无码国产| 久久久亚洲欧洲日产国码二区 | 亚洲精品老司机在线观看| 久久久久亚洲av成人无码电影| 中国亚洲女人69内射少妇 | 国产精品美女午夜爽爽爽免费| 女人张开腿等男人桶免费视频| 免费看国产曰批40分钟| 亚洲精品A在线观看| 亚洲av无码潮喷在线观看| 亚洲成人网在线观看| 亚洲精品乱码久久久久久蜜桃图片| 天天综合亚洲色在线精品| 亚洲一区二区三区免费| 无码精品国产一区二区三区免费| 日韩免费一区二区三区在线| 在线日韩av永久免费观看| 亚洲男人av香蕉爽爽爽爽| 午夜亚洲www湿好大| 亚洲国产av一区二区三区丶| 亚洲AV成人精品日韩一区| XXX2高清在线观看免费视频| 久久国产精品免费专区| 最近2019中文免费字幕| 久久亚洲国产成人精品无码区|