国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

應(yīng)用雙緩沖技術(shù)解決畫面閃爍的問題

2019-11-18 16:08:07
字體:
供稿:網(wǎng)友

    有些時(shí)候我們可能在J2ME中遇到畫面閃爍的問題,這時(shí)候我們可以應(yīng)用雙緩沖的技術(shù)來解決,不過由于現(xiàn)在越來越多的手機(jī)自身就支持雙緩沖了。所以這里只做個(gè)簡單的介紹。

    我寫了程序本來想在NOkia 6108上比較用和不用的區(qū)別,結(jié)果這個(gè)手機(jī)自己就支持雙緩沖,所以根本沒有比較出來。不過了解這個(gè)技術(shù)還是有必要的,所以我決定還是寫出來。雙緩沖本來是在開發(fā)PC應(yīng)用程序的時(shí)候遇到的。在MIDP開發(fā)中同樣存在,當(dāng)你在屏幕上進(jìn)行原始寫畫的時(shí)候,如果很復(fù)雜的話,用戶會(huì)發(fā)現(xiàn)界面在閃爍。因此你可以這樣做,首先在另一個(gè)圖片上進(jìn)行paint()得操作,當(dāng)完成了以后就把它c(diǎn)opy到屏幕上,由于通常copy得時(shí)候速度很快就不會(huì)出現(xiàn)閃爍了。這個(gè)技術(shù)就是雙緩沖。

     Canvas類提供了isDoubleBuffered()方法來判斷設(shè)備是不是支持這個(gè)功能,如果返回true的話,那么我們就沒有必要使用雙緩沖了,如果false的話,我們可以這么做:
public DoubleCanvas(UIController uicontroller)
    {
        super();
        this.uicontroller = uicontroller;
        width = this.getWidth();
        height = this.getHeight();
        this.setCommandListener(this);
        if(!isDoubleBuffered())
        {
            offImage = Image.createImage(width,height);
        }
            
           }

    
    PRotected void paint(Graphics arg0)
    {
        
        arg0.drawString(isDoubleBuffered()+"",width/2,height/2,Graphics.HCENTERGraphics.TOP);
        Graphics saved = arg0;
        if(offImage != null)
        {
            arg0 = offImage.getGraphics();
        }
        arg0.setColor(255,128,128);
        for(int i = 2,j=2;i<width/2-6&&j<height/2-6;i=i+2,j=j+2)
        {
            arg0.drawRect(i,j,width-2*i,height-2*j);
        }
        if(arg0 != saved)
        {
            saved.drawImage(offImage,0,0,Graphics.LEFTGraphics.TOP);
        }

    }

得到offImage得Graphics實(shí)例后,進(jìn)行paint()得操作。這個(gè)部分通常比較復(fù)雜,我這里的不夠復(fù)雜:)
然后把offImage直接copy到屏幕上也就是執(zhí)行saved.drawImage(offImage,0,0,Graphics.LEFTGraphics.TOP);

      我寫了一個(gè)應(yīng)用程序來比較使用和不使用雙緩沖的效果,但是由于我的手機(jī)支持雙緩沖所以看不出效果,如果你有興趣,那么可以把paint()部分的代碼修改的復(fù)雜一些然后再移植到不支持的手機(jī)上也許可以看出效果,下面是我程序的代碼:

import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;



public class DoubleBufferMIDlet extends MIDlet
{
    private UIController uicontroller;
   
    protected void startApp() throws MIDletStateChangeException
    {
        uicontroller = new UIController(this);
        uicontroller.init();

    }

      protected void pauseApp()
    {
     

    }

   
    protected void destroyApp(boolean arg0) throws MIDletStateChangeException
    {
        }

}

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.List;


public class MainListUI extends List implements CommandListener
{
    private UIController uicontroller;
   
   
    public MainListUI(UIController uicontroller)
    {
        super("Test",List.IMPLICIT);
        this.uicontroller = uicontroller;
        this.append("Non-buffer",null);
        this.append("Double-buffer",null);
        this.setCommandListener(this);
    }
   
    public void commandAction(Command arg0, Displayable arg1)
    {

        if(arg0 == List.SELECT_COMMAND)
        {
            if(this.getSelectedIndex() == 0)
            {
               
                uicontroller.handleEvent(UIController.EventID.DISPLAY_NON_BUFFER);
            }
            else
            {
               
                uicontroller.handleEvent(UIController.EventID.DISPLAY_BUFFER);
            }
        }
       


    }

}

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;


public class UIController implements CommandListener
{

    private Display display;
    private DoubleBufferMIDlet midlet;
    private MainListUI mainList;
    private NonDoubleCanvas noDoubleCanvas;
    private DoubleCanvas doubleCanvas;
    public static final Command backCommand = new Command("Back",Command.BACK,2);
   
    public static class EventID
    {
        public static final int DISPLAY_NON_BUFFER = 0;
        public static final int DISPLAY_BUFFER = 1;
    }
    
  
    public UIController(DoubleBufferMIDlet midlet)
    {
        this.midlet = midlet;
    }
   
    public void init()
    {
        display = Display.getDisplay(midlet);
        mainList = new MainListUI(this);
        noDoubleCanvas = new NonDoubleCanvas(this);
        doubleCanvas = new DoubleCanvas(this);
        addCommand();
        display.setCurrent(mainList);
    }
   
    public void addCommand()
    {
        noDoubleCanvas.addCommand(backCommand);
        doubleCanvas.addCommand(backCommand);
    }
   
    public Display getDisplay()
    {
        return display;
    }
   
    public void setCurrent(Displayable disp)
    {
        display.setCurrent(disp);
    }
   
    public void handleEvent(int eventID)
    {
        switch(eventID)
        {
            case EventID.DISPLAY_BUFFER:
            {
                setCurrent(doubleCanvas);
                System.out.println(EventID.DISPLAY_BUFFER);
                break;
            }
            case EventID.DISPLAY_NON_BUFFER:
            {
                setCurrent(noDoubleCanvas);
                System.out.println(EventID.DISPLAY_NON_BUFFER);
                break;
            }
        }
    }
    public void commandAction(Command arg0, Displayable arg1)
    {
       
        if(arg0 == backCommand)
        {
            display.setCurrent(mainList);
        }


    }


}

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;


public class NonDoubleCanvas extends Canvas implements CommandListener
{
    
    private UIController uicontroller;
    private int width;
    private int height;
  
    public NonDoubleCanvas(UIController uicontroller)
    {
        super();
        this.uicontroller = uicontroller;
        width = this.getWidth();
        height = this.getHeight();
        this.setCommandListener(this);
    }

  
    protected void paint(Graphics arg0)
    {
       
        arg0.setColor(100,100,100);
        arg0.drawString(isDoubleBuffered()+"",width/2,height/2,Graphics.HCENTERGraphics.TOP);
        for(int i = 2,j=2;i<width/2-6&&j<height/2-6;i=i+2,j=j+2)
        {
            arg0.drawRect(i,j,width-2*i,height-2*j);
        }

    }


    public void commandAction(Command arg0, Displayable arg1)
    {
        
        uicontroller.commandAction(arg0,arg1);
    }

}

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;


public class DoubleCanvas extends Canvas implements CommandListener
{

    
    private UIController uicontroller;
    private Image offImage;
    private int width;
    private int height;
    
    public DoubleCanvas(UIController uicontroller)
    {
        super();
        this.uicontroller = uicontroller;
        width = this.getWidth();
        height = this.getHeight();
        this.setCommandListener(this);
        if(!isDoubleBuffered())
        {
            offImage = Image.createImage(width,height);
        }
            
       
    }


  
    protected void paint(Graphics arg0)
    {
        
        arg0.drawString(isDoubleBuffered()+"",width/2,height/2,Graphics.HCENTERGraphics.TOP);
        Graphics saved = arg0;
        if(offImage != null)
        {
            arg0 = offImage.getGraphics();
        }
        arg0.setColor(255,128,128);
        for(int i = 2,j=2;i<width/2-6&&j<height/2-6;i=i+2,j=j+2)
        {
            arg0.drawRect(i,j,width-2*i,height-2*j);
        }
        if(arg0 != saved)
        {
            saved.drawImage(offImage,0,0,Graphics.LEFTGraphics.TOP);
        }

    }


    public void commandAction(Command arg0, Displayable arg1)
    {
         uicontroller.commandAction(arg0,arg1);
    }

}

(出處:http://www.survivalescaperooms.com)



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 调兵山市| 永修县| 永年县| 兴隆县| 秀山| 米泉市| 敦化市| 松滋市| 会同县| 安丘市| 井陉县| 周口市| 哈巴河县| 滨州市| 西安市| 永登县| 个旧市| 冷水江市| 南投县| 敦煌市| 嘉禾县| 乌什县| 电白县| 集安市| 托里县| 平邑县| 奈曼旗| 湟中县| 霍邱县| 宜君县| 台南县| 元江| 梅河口市| 铅山县| 桐梓县| 马龙县| 武宁县| 山阳县| 芜湖县| 城固县| 赣榆县|