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

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

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

2019-11-18 12:25:33
字體:
供稿:網(wǎng)友

  在J2ME中,PRofiles是用于定義用戶接口API的。MIDP定義了兩種這類API,被稱為高層API和底層API,高層API要求你使用面向事務(wù)的抽象來定義用戶接口做什么。你并沒有對屏幕上所畫的東西的真正控制—實現(xiàn)選擇了對設(shè)備最佳的實現(xiàn)方式。高層API對于所有MIDP-enabled設(shè)備是可移植的,并且它是真正適合于商業(yè)應(yīng)用的。更多有關(guān)高層API的信息請關(guān)注后續(xù)的J2ME技術(shù)Tips。
  
  底層API是為游戲開發(fā)人員預(yù)備的。不像高層API,底層API賦予你完全的對屏幕和事件的訪問能力,這種訪問能力是有代價的,因為這樣你將負(fù)責(zé)畫屏幕上所顯示的任何東西。你可以在同一個應(yīng)用中同時使用高層API和底層API。把應(yīng)用看作一副撲克牌,同時只能有一張是可見的(很象J2SE平臺上提供的java.awt.CardLayout類所提供的功能),每張卡片,可以被認(rèn)為是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子類必須實現(xiàn)一個繪圖方法,它是被系統(tǒng)調(diào)用來重畫屏幕的。
  
  繪圖方法是通過Graphics對象傳遞的,Graphics對象是用來定義標(biāo)準(zhǔn)的畫圖方法的,而這些都是你所需要的,例如,drawArc,drawLine,drawRect和drawString等。MyCanvas范例簡單的將屏幕畫成白色來清楚屏幕,然后在屏幕的中間上方畫一條線(黑色的)。
  
  你激活一個canvas是通過調(diào)用MIDlet的Display對象的setCurrent方法來實現(xiàn)的。通常在應(yīng)用的MIDlet類的startApp方法中調(diào)用:
  
  // 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能工作,它有一個問題:沒有明顯的方式可以從它退出。你需要引導(dǎo)用戶以某種方式輸入。有兩種方式可以實現(xiàn):使用行輸入事件或使用命令事件。
  
  Canvas答應(yīng)使用行輸入事件,是通過覆蓋canvas類定義的適當(dāng)?shù)氖录l(fā)送方法來實現(xiàn)的。事件生成的可用方法有:
  
  按鍵(keyPressed,keyRepeated,和keyReleased)
  
  使用指針(pointerPressed,pointerDragged和pointerReleased)假如指針在設(shè)備上可以使用的話
  
  顯示canvas(showNotify,hideNotify)
  
  例如,你可以增加一種方式結(jié)束應(yīng)用,通過在canvas中定義一個keyPressed事件:
  
  protected void keyPressed( int keyCode )
  {
  ((MyMIDlet) midlet).exit();
  }
  
  在所有的鍵盤事件中,keycode識別按鍵并激發(fā)事件。正值表示Unicode字符,而負(fù)值是一個鍵無法被直觀的轉(zhuǎn)換成Unicode。為了避免區(qū)分哪一個鍵表示哪一個,這種有不同設(shè)備確定的問題,canvas類為常用鍵定義了一些限制。非凡是,它定義了抽象游戲行為(UP, DOWN, LEFT, RIGHT, FIRE, GAME_A, GAME_B, GAME_C, 和GAME_D)它們的鍵盤代碼映射圖可以實時定義。在它初始化過程中,設(shè)備可以調(diào)用canvas.getGameAction來確定哪種鍵盤映射更適合于操作。
  
  你可以定義一個基礎(chǔ)類,就象:
  
  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可用的設(shè)備都支持指針。你可以在指針有效的時候來使用它的優(yōu)勢。但是你不能夠假設(shè)它是可用的。你可以檢測是否指針事件可以被激發(fā),通過調(diào)用Canvas.haspointerEvents。指針事件方法獲取指針的位置:
  
  protected void pointerPressed( int x, int y )
  {
  // do something here
  }
  
  另一種方法引導(dǎo)用戶輸入是為canvas附加命令。一個命令是一個動作的抽象表現(xiàn)。它有一個用戶定義的label,type和優(yōu)先級。設(shè)備使用type映射命令到相應(yīng)的鍵或按鈕。例如,假如設(shè)備有一個標(biāo)準(zhǔn)的OK鍵,指定一個命令類型為OK,確保OK按鈕激發(fā)這個命令。
  
  有效的類型有BACK, CANCEL, EXIT, HELP, ITEM, OK, SCREEN, 和STOP。一部分或全部這些都可以映射到相同的按鍵或按鈕。這樣,當(dāng)有沖突的時候,設(shè)備可以使用優(yōu)先級來適當(dāng)?shù)呐帕忻畲涡颉?yōu)先級是一個正整數(shù),1是最高優(yōu)先級。
  
  命令是使用Command類來創(chuàng)建的,如下:
  
  Command exitCommand =
  new Command( "Exit", Command.SCREEN, 1 );
  
  你使用addCommand方法來將命令添加到canvas:
  
  canvas.addCommand(exitCommand);
  
  你必須注冊命令,使用:
  
  setListener:
  canvas.setListener( listener ) ;
  
  監(jiān)聽器必須實現(xiàn)CommandListener借口。它對于主要的MIDlet類來實現(xiàn)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,它在一個命令被激發(fā)的時候被調(diào)用。一個激發(fā)命令對象的引用被傳入,同時一個顯示對象的引用被引用,它是在它被激活的時候

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 萨迦县| 临汾市| 江陵县| 双流县| 田阳县| 从化市| 木里| 繁昌县| 酒泉市| 工布江达县| 淳安县| 定边县| 富川| 呼伦贝尔市| 厦门市| 通道| 泾阳县| 桂东县| 龙胜| 寿光市| 奉贤区| 普兰县| 车致| 鹤庆县| 新疆| 应用必备| 灌南县| 天台县| 汉川市| 博野县| 沂水县| 西峡县| 马山县| 丽江市| 宜昌市| 西安市| 扶绥县| 金阳县| 吉木乃县| 鹤峰县| 内黄县|