亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

高手教您使用MIDP底層用戶接口API的方法

2019-11-18 12:25:33
字體:
來源:轉載
供稿:網友

  在J2ME中,PRofiles是用于定義用戶接口API的。MIDP定義了兩種這類API,被稱為高層API和底層API,高層API要求你使用面向事務的抽象來定義用戶接口做什么。你并沒有對屏幕上所畫的東西的真正控制—實現選擇了對設備最佳的實現方式。高層API對于所有MIDP-enabled設備是可移植的,并且它是真正適合于商業應用的。更多有關高層API的信息請關注后續的J2ME技術Tips。
  
  底層API是為游戲開發人員預備的。不像高層API,底層API賦予你完全的對屏幕和事件的訪問能力,這種訪問能力是有代價的,因為這樣你將負責畫屏幕上所顯示的任何東西。你可以在同一個應用中同時使用高層API和底層API。把應用看作一副撲克牌,同時只能有一張是可見的(很象J2SE平臺上提供的java.awt.CardLayout類所提供的功能),每張卡片,可以被認為是MIDP詞匯中的屏幕(Screen),對于每一張或者使用高層API,或者使用底層API,但是不能同時使用。唯一的例外是使用命令對象,將在Tips的后面探討。
  
  在MIDlet中使用底層API,是不許編寫一個Canvas類的擴展類:
  
  // Simple canvas
  import javax.microedition.lcdui.*;
  import javax.microedition.midlet.*;
  
  public class MyCanvas extends Canvas
  {
  private MIDlet midlet;
  public MyCanvas( MIDlet midlet )
  {
  this.midlet = midlet;
  }
  protected void paint( Graphics g )
  {
  g.setColor( 255, 255, 255 );
  g.fillRect( 0, 0, getWidth(),
  getHeight() );
  g.setColor( 0, 0, 0 );
  g.drawString
  ( "Hello there!", getWidth()/2, 0,
  g.TOP g.HCENTER );
  }
  }
  
  所有的用戶接口類都在javax.microedition.lcdui包中。注重你也需要到如javax.microedition.midlet包,因為你將為每一個canvas傳遞一個引用到MIDlet。你的canvas子類必須實現一個繪圖方法,它是被系統調用來重畫屏幕的。
  
  繪圖方法是通過Graphics對象傳遞的,Graphics對象是用來定義標準的畫圖方法的,而這些都是你所需要的,例如,drawArc,drawLine,drawRect和drawString等。MyCanvas范例簡單的將屏幕畫成白色來清楚屏幕,然后在屏幕的中間上方畫一條線(黑色的)。
  
  你激活一個canvas是通過調用MIDlet的Display對象的setCurrent方法來實現的。通常在應用的MIDlet類的startApp方法中調用:
  
  // Simple MIDlet
  
  import javax.microedition.midlet.*;
  
  public class MyMIDlet extends MIDlet
  {
  
  private Display display;
  private MyCanvas canvas;
  
  public MyMIDlet()
  {
  display =
  Display.getDisplay( this );
  canvas = new MyCanvas( this );
  }
  
  protected void startApp()
  {
  display.setCurrent( canvas );
  }
  
  protected void pauseApp()
  {
  }
  
  protected void destroyApp
  ( boolean unconditional )
  {
  }
  
  public void exit(){
  destroyApp( true );
  notifyDestroyed();
  }
  }
  
  盡管這個MIDlet能工作,它有一個問題:沒有明顯的方式可以從它退出。你需要引導用戶以某種方式輸入。有兩種方式可以實現:使用行輸入事件或使用命令事件。
  
  Canvas答應使用行輸入事件,是通過覆蓋canvas類定義的適當的事件發送方法來實現的。事件生成的可用方法有:
  
  按鍵(keyPressed,keyRepeated,和keyReleased)
  
  使用指針(pointerPressed,pointerDragged和pointerReleased)假如指針在設備上可以使用的話
  
  顯示canvas(showNotify,hideNotify)
  
  例如,你可以增加一種方式結束應用,通過在canvas中定義一個keyPressed事件:
  
  protected void keyPressed( int keyCode )
  {
  ((MyMIDlet) midlet).exit();
  }
  
  在所有的鍵盤事件中,keycode識別按鍵并激發事件。正值表示Unicode字符,而負值是一個鍵無法被直觀的轉換成Unicode。為了避免區分哪一個鍵表示哪一個,這種有不同設備確定的問題,canvas類為常用鍵定義了一些限制。非凡是,它定義了抽象游戲行為(UP, DOWN, LEFT, RIGHT, FIRE, GAME_A, GAME_B, GAME_C, 和GAME_D)它們的鍵盤代碼映射圖可以實時定義。在它初始化過程中,設備可以調用canvas.getGameAction來確定哪種鍵盤映射更適合于操作。
  
  你可以定義一個基礎類,就象:
  
  public abstract class
  GameCanvas extends Canvas
  {
  protected MIDlet midlet;
  protected int  fireKey;
  protected int  leftKey;
  protected int  rightKey;
  protected int  upKey;
  protected int  downKey;
  
  public GameCanvas( MIDlet midlet )
  {
  this.midlet = midlet;
  fireKey = getKeyCode( FIRE );
  leftKey = getKeyCode( LEFT );
  rightKey = getKeyCode( RIGHT );
  upKey = getKeyCode( UP );
  downKey = getKeyCode( DOWN );
  }
  }
  
  然后,擴展它,就象:
  
  public class MyCanvas extends GameCanvas
  {
  private String message
  = "Press any key";
  
  public MyCanvas( MIDlet midlet )
  {
  super( midlet );
  }
  
  protected void paint( Graphics g )
  {
  g.setColor( 255, 255, 255 );
  g.fillRect( 0, 0, getWidth(),
  getHeight() );
  g.setColor( 0, 0, 0 );
  g.drawString
  ( message, getWidth()/2, 0,
  g.TOP g.HCENTER );
  }
  
  protected void keyPressed( int keyCode )
  {
  if( keyCode == fireKey )
  {
  message = "FIRE";
  } else if( keyCode == leftKey )
  {
  message = "LEFT";
  } else if( keyCode == rightKey )
  {
  message = "RIGHT";
  } else if( keyCode == upKey )
  {
  message = "UP";
  } else if( keyCode == downKey )
  {
  message = "DOWN";
  } else {
  message = getKeyName( keyCode );
  }
  
  repaint();
  }
  }
  
  指針事件是可選項,因為不是所有的MIDP可用的設備都支持指針。你可以在指針有效的時候來使用它的優勢。但是你不能夠假設它是可用的。你可以檢測是否指針事件可以被激發,通過調用Canvas.haspointerEvents。指針事件方法獲取指針的位置:
  
  protected void pointerPressed( int x, int y )
  {
  // do something here
  }
  
  另一種方法引導用戶輸入是為canvas附加命令。一個命令是一個動作的抽象表現。它有一個用戶定義的label,type和優先級。設備使用type映射命令到相應的鍵或按鈕。例如,假如設備有一個標準的OK鍵,指定一個命令類型為OK,確保OK按鈕激發這個命令。
  
  有效的類型有BACK, CANCEL, EXIT, HELP, ITEM, OK, SCREEN, 和STOP。一部分或全部這些都可以映射到相同的按鍵或按鈕。這樣,當有沖突的時候,設備可以使用優先級來適當的排列命令次序。優先級是一個正整數,1是最高優先級。
  
  命令是使用Command類來創建的,如下:
  
  Command exitCommand =
  new Command( "Exit", Command.SCREEN, 1 );
  
  你使用addCommand方法來將命令添加到canvas:
  
  canvas.addCommand(exitCommand);
  
  你必須注冊命令,使用:
  
  setListener:
  canvas.setListener( listener ) ;
  
  監聽器必須實現CommandListener借口。它對于主要的MIDlet類來實現CommandListener來獲取exit命令是通用的,如下所示:
  
  // Simple MIDlet
  import javax.microedition.midlet.*;
  public class MyMIDlet
  extends MIDlet implements
  CommandListener
  {
  private Display display;
  private MyCanvas canvas;
  private Command
  exitCommand = new Command(
  "Exit", Command.SCREEN, 1 );
  public MyMIDlet(){
  display = Display.getDisplay( this );
  canvas = new MyCanvas( this );
  canvas.addCommand( exitCommand );
  canvas.setListener( this );
  }
  protected void startApp()
  {
  display.setCurrent( canvas );
  }
  protected void pauseApp()
  {
  }
  protected void destroyApp
  ( boolean unconditional )
  {
  }
  public void exit(){
  destroyApp( true );
  notifyDestroyed();
  }
  public void commandAction
  ( Command c, Displayable d )
  {
  if( c == exitCommand )
  {
  exit();
  }
  }
  }
  
  CommandListener接口定義一個簡單的方法,commandAction,它在一個命令被激發的時候被調用。一個激發命令對象的引用被傳入,同時一個顯示對象的引用被引用,它是在它被激活的時候

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人成电影在线观看天堂色| 91黑丝在线观看| 国产精品第七十二页| 久久影视三级福利片| 搡老女人一区二区三区视频tv| 欧洲成人午夜免费大片| 日韩欧美在线观看视频| 午夜精品视频网站| 欧美国产日韩一区二区在线观看| 色偷偷亚洲男人天堂| 亚洲系列中文字幕| 亚洲国产精品国自产拍av秋霞| 欧美黑人性视频| 亚洲人成网站免费播放| 亚洲精品99999| 欧美综合在线观看| 久久精品一偷一偷国产| 欧美性猛交xxxx乱大交| 亚洲精品丝袜日韩| 国产亚洲精品久久久久久777| 亚洲国产精品99久久| 中文字幕亚洲无线码a| 国产精品欧美日韩一区二区| 久久青草福利网站| 亚洲国模精品一区| 成人黄色免费在线观看| 欧美激情视频一区| 久久国产精彩视频| 久久精品美女视频网站| 亚洲国产精品悠悠久久琪琪| 国产一区深夜福利| 日本国产精品视频| 久久久久久91香蕉国产| 亚洲最新视频在线| 国产精品普通话| 国产精品18久久久久久麻辣| 欧美又大粗又爽又黄大片视频| 91成人福利在线| 亚洲欧美三级在线| 亚洲免费视频一区二区| 国产精品久久9| 国产成人精品免高潮在线观看| 日韩中文字幕国产精品| www国产亚洲精品久久网站| 精品视频在线导航| 久久久久久久网站| 日韩电影大片中文字幕| 精品国产老师黑色丝袜高跟鞋| 国产视频久久久久久久| 久久久精品视频成人| 欧美日韩免费区域视频在线观看| 91手机视频在线观看| 精品久久久久久久久中文字幕| 欧美日韩国产中字| 日韩精品在线视频观看| 久久99久久99精品中文字幕| 国产97色在线| 欧美日韩另类字幕中文| 日本成人精品在线| 午夜免费日韩视频| 国产精品揄拍500视频| 国产精品久久久91| 国产成人精品久久亚洲高清不卡| 国产做受69高潮| 欧美色图在线视频| 日韩av手机在线看| 这里只有视频精品| 日韩二区三区在线| 亚洲国产成人久久| 最好看的2019的中文字幕视频| 国产亚洲精品美女久久久久| 日韩高清av一区二区三区| 精品久久中文字幕久久av| 日韩电影视频免费| 宅男66日本亚洲欧美视频| 日韩精品免费在线观看| 精品久久在线播放| 国产a∨精品一区二区三区不卡| 91精品免费久久久久久久久| 亚洲乱码av中文一区二区| 538国产精品一区二区免费视频| 一区二区三区国产视频| 最近2019年中文视频免费在线观看| 日韩av有码在线| 欧美国产在线电影| 高清欧美电影在线| 国产欧美va欧美va香蕉在| 欧美精品电影免费在线观看| 欧美亚洲伦理www| 国模视频一区二区三区| 俺去啦;欧美日韩| 欧美刺激性大交免费视频| 日韩精品在线观看一区二区| 精品国产乱码久久久久酒店| 亚洲欧美激情在线视频| 日韩午夜在线视频| 国产精品视频地址| 成人情趣片在线观看免费| 亚洲无线码在线一区观看| 久久五月情影视| 欧美成人精品一区二区| 亚洲乱码av中文一区二区| 日本精品一区二区三区在线播放视频| 中文字幕亚洲综合久久| 国产精品av电影| 日本一区二区三区四区视频| 丝袜亚洲另类欧美重口| 国产精品视频资源| 亚洲女同性videos| 2019亚洲日韩新视频| 国产日本欧美一区二区三区| 92裸体在线视频网站| 国产在线视频不卡| 亚洲午夜性刺激影院| 欧美一性一乱一交一视频| 91高清视频在线免费观看| 日韩电视剧免费观看网站| 一区二区三欧美| 最好看的2019年中文视频| 中文字幕av一区二区三区谷原希美| 日韩成人av一区| 国产精品旅馆在线| 日韩av三级在线观看| 欧美在线视频观看免费网站| 欧美视频不卡中文| 色久欧美在线视频观看| 日韩欧美国产激情| 国产性猛交xxxx免费看久久| 日韩欧美主播在线| 永久免费精品影视网站| 国产色综合天天综合网| 欧洲成人在线视频| 91在线观看免费观看| 亚洲一区二区黄| 69av成年福利视频| 午夜免费日韩视频| 亚洲精品美女久久久| 日韩国产激情在线| 亚洲第一级黄色片| 亚洲欧美激情在线视频| 欧美日韩中文字幕日韩欧美| 国产精品久久久久av免费| 91av在线播放| 精品国产依人香蕉在线精品| 中国china体内裑精亚洲片| 亚洲免费视频观看| 91精品国产高清久久久久久91| 亚洲欧洲日产国码av系列天堂| 日韩精品视频三区| 91久久国产精品91久久性色| 亚洲人线精品午夜| 国产亚洲欧洲黄色| 亚洲精品91美女久久久久久久| 在线日韩中文字幕| 青青青国产精品一区二区| 国产美女被下药99| 成人精品一区二区三区电影免费| 亚洲欧美日韩一区二区在线| 97在线视频免费看| 欧美三级欧美成人高清www| 最近2019年日本中文免费字幕| 伊人久久免费视频| 日韩精品亚洲元码| 怡红院精品视频|