J2ME開發(fā)之手機鍵值適配

          J2ME開發(fā)之手機鍵值適配

          本來不想寫J2ME開發(fā)的時候要根據(jù)不同手機平臺適配各種鍵值這個問題,覺得沒撒意思,也沒什么技術(shù)含量,但是今天看到了一個讓我很無語的東西,所以我決定要寫出來。稍候再說這個讓我不爽的東西,先不要影響我們分享技術(shù)的心情。NOW BEGIN …

          故事背景:最近要開發(fā)一個世界天氣在線搜索的軟件,先AD一下,這個軟件是我們Allove Team開發(fā)的有一個生活小軟件,開始的定位就是天氣搜索,后來我想擴展為“生活小助手”就是不但有世界天氣搜索,還有出行參考,還有生活常識之類的東西。正在開發(fā)中。 由于,開發(fā)過程中需要使用Canvas才能做出很漂亮的界面,所以引發(fā)了一個老問題 — 手機鍵值!

          很多人都說,要適配所有手機的鍵值是不可能的。因為,已是J2ME中沒有對手機的左右軟鍵的鍵值定義,而是很多手機也沒定義,再者就是手機多多了,像華為,中興,聯(lián)想,諾基亞,摩托羅拉,西門子,索愛,黑莓,多普達等等這些大廠家都沒個定數(shù),更別所多如牛毛的山寨機了,所以這種說法也是無可厚非的。 即使你把 左鍵 -7 , 右鍵 -6 , OK鍵 -5 這些都設(shè)置好能支持大部分的手機,還是難免有個害群之馬啊。 所以, 沒有標準導(dǎo)致了這個嚴重的問題 : 要一次性搞定所有手機的鍵值問題難道非常之大。

          但是,天知道我怎么一生下來就是個不信邪的主兒,Google百度了幾下發(fā)現(xiàn)沒有統(tǒng)一鍵值之后開始思考自己的路了。最后,想了一個辦法,目的是我要一次性搞定所有手機的鍵值。怎么做?讓用戶手機告訴你唄。思路如下:用戶第一次使用時設(shè)置鍵位。

          1. 用Canvas實現(xiàn)一個鍵位設(shè)置界面,捕獲keyPressed事件;
          2. 在設(shè)置界面中以提示性語言引導(dǎo)用戶按鍵;
          3. 將得到的鍵值保存到RMS中備用;
          4. 完成鍵位設(shè)置;
          5. 在以后要使用按鍵的Canvas中調(diào)用RMS中的數(shù)據(jù),完成操作。


          下面是完成這個設(shè)置的簡要代碼結(jié)構(gòu):

          1. //首先你需要一個數(shù)組:
          2. private String[] drawArray = {"左功能鍵","右功能鍵","OK鍵","方向鍵【上】","方向鍵【下】","方向鍵【左】","方向鍵【右】"} ;
          3. //然后你需要兩個標志位
          4. private boolean config_finished = false ;
          5. private boolean firsttime = true ;
          6. //再者你需要一點實現(xiàn)邏輯
          7. if(drawIndex > 6){
          8.     config_finished = true ;
          9.         }
          10.     if(!config_finished){
          11.     if(firsttime){
          12.     g.drawString("【鍵位設(shè)置】",WIDTH / 2 - titleWidht / 2 , startY, Graphics.TOP|Graphics.LEFT);
          13.     g.drawString(initStr, 5, startY + 1*lineHeight, Graphics.TOP|Graphics.LEFT);
          14.     g.drawString(prefix + drawArray[drawIndex] , 5, startY + 2*lineHeight, Graphics.TOP|Graphics.LEFT);
          15.     } else {
          16.     g.drawString("【鍵位設(shè)置】",WIDTH / 2 - titleWidht / 2 , startY, Graphics.TOP|Graphics.LEFT);
          17.     g.drawString(initStr, 5, startY + 1*lineHeight, Graphics.TOP|Graphics.LEFT);
          18.     g.drawString(finished + drawArray[drawIndex - 1] + status, 5, startY + 1*lineHeight, Graphics.TOP|Graphics.LEFT);
          19.     g.drawString(prefix + drawArray[drawIndex] , 5, startY + 2*lineHeight, Graphics.TOP|Graphics.LEFT);
          20.     }
          21.     firsttime = false ;
          22.     startY = 0 ;   
          23.     initStr = "" ;
          24.     } else {
          25.     System.out.println("設(shè)置完畢 .... config finished ...");
          26.     g.setColor(0xff0000);
          27.     g.drawString("設(shè)置成功,請按OK鍵返回!", 5, startY + 4*lineHeight, Graphics.TOP|Graphics.LEFT);
          28.     }
          29. //接下來我們需要一點控制信心和按鍵事件的響應(yīng)
          30.     protected void keyPressed(int key){
          31.         if(this.storeKeyValue(WHAT_KEY, key)){
          32.             drawIndex ++ ;
          33.             WHAT_KEY ++ ;
          34.             status = "(成功)" ;
          35.         } else {
          36.             drawIndex -- ;
          37.             WHAT_KEY -- ;
          38.             prefix = "[重設(shè)]" ;
          39.             status = "(失敗)" ;
          40.         }
          41.         if(config_finished && key == config.getOK()){
          42.             System.out.println("read back of OK .. is " + config.getOK());
          43.             wm.setThisAsCurrent(wm.getMainform());
          44.         }
          45.         repaint();
          46.     }
          47. //最后我們需要一個存儲的動作
          48.     private boolean storeKeyValue(int whatkey , int key){}

          請注意,上面這個代碼片段只是完成按鈕設(shè)置的框架,而不是完整代碼,如果你需要完整代碼可以留下信息并且發(fā)郵件告訴我。我會分享給你的。

          下面說一下上面這段代碼的大致思路:
          創(chuàng)建一個你希望設(shè)置的鍵位的數(shù)組:private String[] drawArray , 里面存放著一些提示信息,這些信息用來引導(dǎo)用戶去按鍵,然后使用paint()在界面上繪制這些信息,但又按鍵事件的時候系統(tǒng)會調(diào)用protected void keyPressed(int key)方法,而我們在這個方法中處理一些事件,不作一些控制。例如改變繪制字符串的指針,例如修改鍵位設(shè)置的執(zhí)行狀態(tài) “成功” 或者 “失敗” 。 另外還需要控制的就是設(shè)置的完成狀態(tài) , 最終目的是把鍵值寫入到RMS中備用 。

          下面是鍵值調(diào)用的持久類的完整代碼:

          1. package org.allove.weather.lib;
          2. public class KeyMap {
          3.     ///////////////
          4.     private static KeyValueRms config = KeyValueRms.getInstance();
          5.     public static final int key_LeftSoft = config.getLeftSoft() ;
          6.     public static final int key_RightSoft = config.getRightSoft() ;
          7.     public static final int key_OK = config.getOK() ;
          8.     public static final int key_UP = config.getUP() ;
          9.     public static final int key_DOWN = config.getDown() ;
          10.     public static final int key_LEFT = config.getLeft() ;
          11.     public static final int key_RIGHT = config.getRight() ;
          12.     ///////////////
          13. }

          至于這個KeyValueRms 怎么去實現(xiàn)就不是本文的主要內(nèi)容了,這是RecordStore的內(nèi)容,這里就不贅述了 。

          總的來說,我覺得這是一個很簡單的問題,也很容易想到,應(yīng)該不到5分鐘吧,想到這個解決方案。由于我覺得這個東西很簡單,價值也不那么明顯,所以導(dǎo)致了我看到一個東西之后很郁悶。今天,無意中搜索鍵值玩,發(fā)現(xiàn)了萬方數(shù)據(jù)里面的一片論文:《一種J2ME軟件適配不同手機鍵值的方法》讓我倍感無語。這個方法被人申請專利了,我很無語,這東西也能申請壯麗,我操,早知道我早兩年也去申請了。FUCK! 還說得那么玄乎,很糾結(jié)啊。

          最后,要來說一下這個可行性和用戶體驗的問題。

          1. 其實這東西不是很好,完全依賴于keyPressed方法,如果不支持這個方法呢?
          2. 在某些手機中按左右軟鍵的時候是沒有反應(yīng)的,比如巨頭諾基亞
          3. 再說用戶體驗,這個問題有點嚴重,一旦設(shè)置錯誤可能就需要從新安裝軟件,這是相當(dāng)不友好的,因為RMS的數(shù)據(jù)要卸載才能清除,其實這個到也無所謂啦,你可以在軟件里面做一個重新設(shè)置的功能,這到不致命
          4. 然后就是,不是所有用戶都能看懂你的引導(dǎo)語言,難免會設(shè)置錯誤,你不能保證每個用戶都是聰明的
          5. 由于手機廠商數(shù)目巨大,這個方法的代價是巨大的,慎用

          拋棄這種方法之后如何去更快捷的適配不同手機的鍵值問題呢?也許按手機型號發(fā)布軟件是一個最簡單最直接的方案,局限性就是你必須知道每個平臺的鍵值,希望MIDP3.0不要再有這個問題了?,F(xiàn)在,我們就假設(shè),我們已經(jīng)能夠獲取到不同手機的鍵值,那么我們應(yīng)該如何去寫代碼呢?在每一個keyPressed里面設(shè)置switch case -6 / -7 / -5 的方法顯然是不對的。 我們希望這樣操作:

          1. package org.allove.weather.lib;
          2.  
          3. public class KeyMap {
          4.     ///////////////
          5.     public static final int key_LeftSoft = -7 ;
          6.     public static final int key_RightSoft = -6 ;
          7.     public static final int key_OK = -5 ;
          8.     public static final int key_UP = -4 ;
          9.     public static final int key_DOWN = -3 ;
          10.     public static final int key_LEFT = -2 ;
          11.     public static final int key_RIGHT = -1 ;
          12.     /////////////// 請注意 上面的鍵值只是為了測試 不一定正確
          13. }
          14.  
          15. /////////////////////////////////////////
          16.  // ..... Many Other Things ...
          17. import package org.allove.weather.lib.KeyMap ;
          18.  
          19. public class ACanvas extends Canvas ;
          20.  // ..... Many Other Things ...
          21.     protected void keyPressed(int key){
          22.         if(key == KeyMap.key_LeftSoft){           
          23.             do(.....) ;
          24.         } else if (key == KeyMap.key_OK){           
          25.             do(.....) ;
          26.         } else if (key == KeyMap.key_RightSoft){           
          27.             do(......) ;
          28.         } 
          29.         repaint();
          30.     }
          31.  // ..... Many Other Things ...

          相信這樣的代碼結(jié)構(gòu)是可讀的,方便維護的,容易移植的 。 當(dāng)你需要移植平臺的時候只需要在KeyMap中修改映射即可。 這也許就是OO思想的體現(xiàn)吧 。 好了今天就到這里吧 , 上面的代碼基本都是框架, 如果你希望得到源碼的話可以留言并且發(fā)郵件到sunjianyes#gmail.com獲取,如果你能記得我們Allove Team那就最好不過了。再如果你能夠支持一下我們的發(fā)展就更好了,最好的辦法就是嘗試使用我們的軟件: m.Allove.org
          如果你在下次看到下面這張圖片的時候能想起我們那就是我們最大的成功:

          下面還有:

          1. 2009年05月23日 -- J2ME Canvas
          2. 2009年05月10日 -- 使用NetBeans開發(fā)J2ME
          3. 2009年05月8日 -- KXML2部分詳解(J2ME)
          4. 2009年04月27日 -- J2ME中文亂碼

          posted on 2009-06-10 23:18 菲戈 閱讀(346) 評論(2)  編輯  收藏

          評論

          # re: J2ME開發(fā)之手機鍵值適配 2011-04-25 22:15 齊澤西

          我最近開發(fā)個學(xué)習(xí)軟件,本想通過keyPressed(int keyCode)來適配按鍵的,不過遇到了和你說的“在某些手機中按左右軟鍵的時候是沒有反應(yīng)的,比如巨頭諾基亞”這個問題,還有確認鍵也是獲取不了的。
          想了好多的辦法,也得不到解決,所以請你幫幫忙:看用什么辦法可以解決按鍵適配問題。  回復(fù)  更多評論   

          # re: J2ME開發(fā)之手機鍵值適配 2011-04-25 22:17 齊澤西

          我的郵箱是:qizexi@163.com如果有興趣我們可以一起合作開發(fā)。  回復(fù)  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計

          留言簿

          文章檔案

          相冊

          搜索

          最新評論

          主站蜘蛛池模板: 平顶山市| 改则县| 弥勒县| 保靖县| 海兴县| 克东县| 苗栗县| 奉贤区| 咸阳市| 富锦市| 宁南县| 旬邑县| 永平县| 桃园县| 彭阳县| 阿克陶县| 罗城| 邯郸市| 社旗县| 佳木斯市| 绩溪县| 双辽市| 旬阳县| 开封市| 海盐县| 乌兰察布市| 广丰县| 安达市| 汉中市| 宣城市| 阜新| 新昌县| 中卫市| 漠河县| 博白县| 盈江县| 武邑县| 抚顺市| 汝南县| 忻城县| 思南县|