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

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

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

    京山游俠

    專注技術(shù),拒絕扯淡
    posts - 50, comments - 868, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
      在這一篇中,我將向大家介紹圖形用戶界面中的低級圖形用戶界面。所謂低級圖形用戶界面,指的是那種我們可以自己在上面畫圖的控件,它是和TextBox,List等等這些用戶控件剛好相對的概念,因?yàn)檫@些用戶控件的形狀是事先畫好的,無需我們程序員操心,所以稱為高級圖形界面。低級圖形用戶界面什么東西都需要我們自己畫,所以比較復(fù)雜,當(dāng)然也更加靈活,只有想不到,沒有畫不出,所以我們先介紹它。

      在J2ME開發(fā)中,低級圖形用戶界面是由javax.microedition.lcdui.Canvas類實(shí)現(xiàn)的,我們只要繼承這個類,并實(shí)現(xiàn)這個類的paint方法,就可以隨心所欲的進(jìn)行繪畫了。當(dāng)然,繪畫之前,我們少不了要了解我們的手機(jī)屏幕究竟有多大的畫圖空間,這可以通過調(diào)用Canvas類的getWidth和getHeight方法實(shí)現(xiàn)。下面是一個簡短的程序,向大家演示了怎么獲畫布的大小,同時(shí),也算是一個小小的框架。首先,當(dāng)然是創(chuàng)建我們自己的畫布,代碼如下:
    package?com.xkland.j2me;

    import?javax.microedition.lcdui.Canvas;
    import?javax.microedition.lcdui.Graphics;

    /**
    ?*
    ?*?
    @author?海邊沫沫
    ?
    */

    public?class?MyCanvas?extends?Canvas?{
    ????
    ????
    /**?Creates?a?new?instance?of?MyCanvas?*/
    ????
    public?MyCanvas()?{
    ????}

    ????
    ????
    public?void?clearBackground(Graphics?g){
    ????????
    int?color?=?g.getColor();
    ????????g.setColor(
    0xffffff);
    ????????g.fillRect(
    0,0,getWidth(),getHeight());
    ????????g.setColor(color);
    ????}

    ????
    ????
    public?void?paint(Graphics?g){
    ????????
    //清除背景
    ????????clearBackground(g);
    ????????
    ????????
    //顯示可供繪圖的區(qū)域的大小
    ????????g.drawString("寬度:",10,10,Graphics.LEFT|Graphics.TOP);
    ????????g.drawString(String.valueOf(getWidth()),
    50,10,Graphics.LEFT|Graphics.TOP);
    ????????g.drawString(
    "高度:",10,25,Graphics.LEFT|Graphics.TOP);
    ????????g.drawString(String.valueOf(getHeight()),
    50,25,Graphics.LEFT|Graphics.TOP);
    ????}

    ????
    }

      第二個類當(dāng)然就是我們的Midlet了,因?yàn)樗侵鞒绦蚵?。在程序啟動的時(shí)候調(diào)用display.setCurrent將畫布設(shè)置為主界面,同時(shí)設(shè)置事件監(jiān)聽器。代碼比較簡單,如下:
    package?com.xkland.j2me;

    import?javax.microedition.midlet.*;
    import?javax.microedition.lcdui.*;

    /**
    ?*
    ?*?
    @author??海邊沫沫
    ?*?
    @version
    ?
    */

    public?class?CanvasTest?extends?MIDlet{
    ????
    private?Canvas?canvas?=?new?MyCanvas();
    ????
    private?Display?display?=?null;
    ????
    private?Command?exitCommand?=?new?Command("退出",Command.EXIT,1);
    ????
    ????
    public?void?startApp()?{
    ????????
    if(display==null){
    ????????????display?
    =?Display.getDisplay(this);
    ????????????canvas.addCommand(exitCommand);
    ????????????canvas.setCommandListener(
    new?MyCommandListener(this,canvas));
    ????????????display.setCurrent(canvas);
    ????????}

    ????}

    ????
    ????
    public?void?pauseApp()?{
    ????}

    ????
    ????
    public?void?destroyApp(boolean?unconditional)?{
    ????}

    }

      第三個類當(dāng)然是我們的事件監(jiān)聽器類了,等一下我們會講到,Canvas支持許多低級事件,比如鍵盤的按鍵事件,所以我們這里把事件監(jiān)聽器單獨(dú)抽取出來,代碼如下:
    package?com.xkland.j2me;

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

    /**
    ?*
    ?*?
    @author?海邊沫沫
    ?
    */

    public?class?MyCommandListener?implements?CommandListener{
    ????
    ????
    private?CanvasTest?app;
    ????
    private?Canvas?canvas;
    ????
    ????
    /**?Creates?a?new?instance?of?MyCommandListener?*/
    ????
    public?MyCommandListener(CanvasTest?app,Canvas?canvas)?{
    ????????
    this.app?=?app;
    ????????
    this.canvas?=?canvas;
    ????}

    ????
    ????
    public?void?commandAction(Command?cmd,?Displayable?displayable){
    ????????
    if(cmd.getLabel().equalsIgnoreCase("退出")){
    ????????????app.destroyApp(
    false);
    ????????????app.notifyDestroyed();
    ????????}

    ????}

    ????
    }

      下面是運(yùn)行效果:
    25.PNG


      知道了畫圖區(qū)域的大小,同時(shí)又知道Canvas可以支持許多低級事件,我們就可以發(fā)揮我們自己的想象力創(chuàng)建一個小游戲了。下面,我將寫一個簡單的拼圖游戲,只需要使用上下左右四個方向鍵操作即可,在事件監(jiān)聽器中,我們只需響應(yīng)Canvas的keyPressed()事件即可。代碼也不復(fù)雜,只需把上面的程序稍加擴(kuò)展即可。當(dāng)然,我們還需要準(zhǔn)備一些圖片當(dāng)素材。

      首先,在網(wǎng)上隨便找一張圖片,使用圖形編輯軟件調(diào)整圖片的大小,然后再裁成3*4共12幅圖象。把這12幅圖象分別命名為1.png到12.png,同時(shí)還要準(zhǔn)備一張全白的圖片,命名為0.png,這張圖片和前面的12張圖片一樣大小。在項(xiàng)目所在的文件夾下建立一個文件夾,取名為pictures,把這些圖片都拷貝進(jìn)去。在NetBeans IDE左邊的文件選項(xiàng)卡中可以看到這些文件,如圖:
    26.PNG


      但是,在生成項(xiàng)目的時(shí)候,這些文件并不會自動打包到項(xiàng)目中,我們必須將這個文件夾捆綁為該項(xiàng)目的資源。在項(xiàng)目上點(diǎn)右鍵,在彈出的菜單中選擇屬性,彈出如下對話框,選中左邊的“庫和資源”,在右邊點(diǎn)擊“添加文件夾”按鈕即可:

    27.PNG

      下面是我的MyCanvas類的全部代碼,其它兩個類的代碼沒有改變。在這里,我使用的圖片是174*280的大小,切割后的小圖片每一個都是58*70的大小,空白的圖片也是58*70的大小。請看代碼:
    package?com.xkland.j2me;

    import?javax.microedition.lcdui.Canvas;
    import?javax.microedition.lcdui.Graphics;
    import?javax.microedition.lcdui.Image;
    import?java.util.Random;

    /**
    ?*
    ?*?
    @author?海邊沫沫
    ?
    */

    public?class?MyCanvas?extends?Canvas?{
    ????
    public?int[][]?pics?=?new?int[4][4];
    ????
    public?Image[]?images?=?new?Image[13];
    ????
    public?int?step?=?0;
    ????
    public?int?spaceX?=?3;
    ????
    public?int?spaceY?=?0;
    ????
    public?int?spaceValue?=?0;
    ????
    ????
    /**?Creates?a?new?instance?of?MyCanvas?*/
    ????
    public?MyCanvas()?{
    ????????
    //隨機(jī)填充數(shù)組
    ????????for(int?i=0;i<4;i++){
    ????????????
    for(int?j=0;j<3;j++){
    ????????????????pics[i][j]?
    =?i*3?+?j?+?1;
    ????????????}

    ????????}
    ???????
    ????????pics[
    0][3]?=?0;
    ????????
    ????????Random?rand?
    =?new?Random();
    ????????
    for(int?i=0;?i<4;?i++){
    ????????????
    int?x1?=?rand.nextInt(3);
    ????????????
    int?y1?=?rand.nextInt(4);
    ????????????
    int?x2?=?rand.nextInt(3);
    ????????????
    int?y2?=?rand.nextInt(4);
    ????????????
    int?n?=?pics[y1][x1];
    ????????????pics[y1][x1]?
    =?pics[y2][x2];
    ????????????pics[y2][x2]?
    =?n;
    ????????}

    ????????
    ????????
    //載入圖片
    ????????for(int?i=0;?i<13;?i++){
    ????????????
    try{
    ????????????????images[i]?
    =?Image.createImage("/"?+?String.valueOf(i)?+?".png");
    ????????????}
    catch(Exception?e){
    ????????????????
    //不做處理
    ????????????}

    ????????}

    ????}

    ????
    ????
    public?void?clearBackground(Graphics?g){
    ????????
    int?color?=?g.getColor();
    ????????g.setColor(
    0xcccccc);
    ????????g.fillRect(
    0,0,getWidth(),getHeight());
    ????????g.setColor(color);
    ????}

    ????
    ????
    public?void?paint(Graphics?g){
    ????????
    //清除背景
    ????????clearBackground(g);
    ????????
    ????????
    //繪制網(wǎng)格
    ????????g.setColor(0x000000);
    ????????g.drawRect(
    1,3,236,284);
    ????????g.drawLine(
    1,74,237,74);
    ????????g.drawLine(
    1,145,178,145);
    ????????g.drawLine(
    1,216,178,216);
    ????????g.drawLine(
    60,3,60,287);
    ????????g.drawLine(
    119,3,119,287);
    ????????g.drawLine(
    178,3,178,287);
    ????????
    ????????
    //根據(jù)pics數(shù)組和images數(shù)組的內(nèi)容繪圖到網(wǎng)格中
    ????????for(int?i=0;?i<4;?i++){
    ????????????
    for(int?j=0;?j<3;?j++){
    ????????????????g.drawImage(images[pics[i][j]],j
    *59+2,i*71+4,Graphics.TOP|Graphics.LEFT);
    ????????????}

    ????????}

    ????????g.drawImage(images[pics[
    0][3]],179,4,Graphics.TOP|Graphics.LEFT);
    ????????
    ????????
    //繪制所用的步驟
    ????????g.drawString("步數(shù):",182,140,Graphics.TOP|Graphics.LEFT);
    ????????g.setColor(
    0xffffff);
    ????????g.fillRect(
    182,158,50,18);
    ????????g.setColor(
    0xff0000);
    ????????g.drawString(String.valueOf(step),
    187,160,Graphics.TOP|Graphics.LEFT);

    ????}

    ????
    ???????
    ????
    public?void?keyPressed(int?keyCode){
    ????????
    switch(getGameAction(keyCode)){
    ????????????
    case?RIGHT:
    ????????????????right();
    ????????????????
    break;
    ????????????
    case?LEFT:
    ????????????????left();
    ????????????????
    break;
    ????????????
    case?UP:
    ????????????????up();
    ????????????????
    break;
    ????????????
    case?DOWN:
    ????????????????down();
    ????????????????
    break;
    ????????}

    ???????repaint();
    ????}

    ????
    ????
    public?void?up(){
    ????????
    if(spaceY?<?3){
    ????????????pics[spaceY][spaceX]?
    =?pics[spaceY+1][spaceX];
    ????????????pics[spaceY
    +1][spaceX]?=?0;
    ????????????spaceY?
    ++;
    ????????????step?
    ++;
    ????????}

    ????}

    ????
    ????
    public?void?down(){
    ????????
    if(spaceY?>0){
    ????????????pics[spaceY][spaceX]?
    =?pics[spaceY-1][spaceX];
    ????????????pics[spaceY
    -1][spaceX]?=?0;
    ????????????spaceY?
    --;
    ????????????step?
    ++;
    ????????}

    ????????
    ????}

    ????
    ????
    public?void?left(){
    ????????
    int?rightLimit?=?2;
    ????????
    if(spaceY?==?0){
    ????????????rightLimit?
    =?3;
    ????????}

    ????????
    if(spaceX?<?rightLimit){
    ????????????pics[spaceY][spaceX]?
    =?pics[spaceY][spaceX+1];
    ????????????pics[spaceY][spaceX
    +1]?=?0;
    ????????????spaceX?
    ++;
    ????????????step?
    ++;
    ????????}

    ????????
    ????}

    ????
    ????
    public?void?right(){
    ????????
    if(spaceX?>?0?){
    ????????????pics[spaceY][spaceX]?
    =?pics[spaceY][spaceX?-1];
    ????????????pics[spaceY][spaceX
    -1]?=?0;
    ????????????spaceX?
    --;
    ????????????step?
    ++;
    ????????}

    ????????
    ????}
    ????
    }


      運(yùn)行項(xiàng)目,得到如下的效果,使用上下左右四個鍵可以移動圖片:

    29.PNG

      游戲過程中的截圖:

    30.PNG

      游戲完成后的截圖:

    28.PNG

      當(dāng)然,大家也可以自己添加拼圖完成后的判斷代碼,在拼圖成功后自動彈出提示信息。

    評論

    # re: 使用NetBeans進(jìn)行J2ME開發(fā)(三):低級圖形用戶界面Canvas  回復(fù)  更多評論   

    2007-08-04 23:38 by prcvictim
    對我很有幫助.太感謝了

    # re: 使用NetBeans進(jìn)行J2ME開發(fā)(三):低級圖形用戶界面Canvas  回復(fù)  更多評論   

    2007-08-05 08:49 by BeanSoft
    感謝分享!

    # re: 使用NetBeans進(jìn)行J2ME開發(fā)(三):低級圖形用戶界面Canvas  回復(fù)  更多評論   

    2007-08-06 00:31 by dreamstone
    找時(shí)間試試,記得上次使用netBean都是1年多前的事情了,不知道新的版本變化大不

    # re: 使用NetBeans進(jìn)行J2ME開發(fā)(三):低級圖形用戶界面Canvas[未登錄]  回復(fù)  更多評論   

    2007-08-23 15:24 by 影子
    rand.nextInt(3);
    這個方法沒有啊 老是報(bào)錯啊

    # re: 使用NetBeans進(jìn)行J2ME開發(fā)(三):低級圖形用戶界面Canvas  回復(fù)  更多評論   

    2007-08-26 17:45 by 海邊沫沫
    @影子

    import java.util.Random;

    Random rand = new Random();

    # re: 使用NetBeans進(jìn)行J2ME開發(fā)(三):低級圖形用戶界面Canvas[未登錄]  回復(fù)  更多評論   

    2007-08-27 14:53 by 影子
    謝謝了 我再試試

    # re: 使用NetBeans進(jìn)行J2ME開發(fā)(三):低級圖形用戶界面Canvas[未登錄]  回復(fù)  更多評論   

    2008-01-02 08:10 by 游子
    請問pakage那里找?還有import 文件??
    能上傳上來嗎?

    # re: 使用NetBeans進(jìn)行J2ME開發(fā)(三):低級圖形用戶界面Canvas[未登錄]  回復(fù)  更多評論   

    2008-07-02 22:35 by yang
    你這邊用的是哪個切割軟件啊

    # re: 使用NetBeans進(jìn)行J2ME開發(fā)(三):低級圖形用戶界面Canvas  回復(fù)  更多評論   

    2009-02-24 16:20 by 不錯
    java.lang.NullPointerException:
    at com.xkland.j2me.MyCanvas.paint(MyCanvas.java:83)
    怎么經(jīng)常報(bào)這個錯誤

    # re: 使用NetBeans進(jìn)行J2ME開發(fā)(三):低級圖形用戶界面Canvas  回復(fù)  更多評論   

    2009-04-08 19:23 by little
    沒有報(bào)錯,正常運(yùn)行,但是沒有圖片顯示啊,請問是什么原因啊

    # re: 使用NetBeans進(jìn)行J2ME開發(fā)(三):低級圖形用戶界面Canvas  回復(fù)  更多評論   

    2009-04-10 17:45 by little
    for(int i=0; i<13; i++){
    try{
    images[i] = Image.createImage("/" + String.valueOf(i) + ".png");
    }catch(Exception e){
    //不做處理
    }
    }
    這一段有問題,想請教一下,createImage(“地址”),這個參數(shù)地址和實(shí)際地址怎么對應(yīng)啊。。。。
    主站蜘蛛池模板: 免费在线看黄的网站| 亚洲中文无码卡通动漫野外| 国产亚洲精彩视频| 成全视频在线观看免费高清动漫视频下载 | 最近免费中文字幕大全高清大全1| 成年女人18级毛片毛片免费 | 足恋玩丝袜脚视频免费网站| 久久精品国产96精品亚洲| 精品免费视在线观看| 亚洲AV日韩精品久久久久久 | 亚洲AV无码一区二区三区在线| 亚洲人成免费网站| 亚洲三级视频在线观看| 无码人妻一区二区三区免费| 亚洲熟妇无码av另类vr影视| 日本免费一区二区三区最新vr| 国产成人亚洲精品播放器下载| 亚洲成av人在片观看| 国产高清对白在线观看免费91| 国产亚洲综合成人91精品| 91精品国产免费| 亚洲Av高清一区二区三区| 免费高清资源黄网站在线观看| 黄色免费在线网址| 亚洲区小说区图片区QVOD| 99re热精品视频国产免费| 亚洲日本国产综合高清| 国产v片免费播放| 老司机精品免费视频| 亚洲视频一区在线观看| 毛片免费全部播放一级| www.av在线免费观看| 亚洲综合一区二区精品导航| 国产免费看JIZZ视频| 日本高清免费中文在线看| 亚洲国产精品线在线观看| 色www永久免费视频| 美女无遮挡拍拍拍免费视频 | 亚洲中文字幕乱码AV波多JI| www.亚洲色图.com| 100部毛片免费全部播放完整|