JAVA(iアプリ)
低レベルAPI型アプリの解説
バイオリズムアプリの解説
低レベルAPIを使用したiアプリを使用する上で必要な情報を解説します。
import com.nttdocomo.ui.*;
import com.nttdocomo.util.*;
import java.util.*;
import java.io.*;
import javax.microedition.io.*;
import com.nttdocomo.io.*;
1行目はiアプリを作成する時に必ず必要となるクラスです。
2行目以降は時刻取得やメモリ保存等のために必要となります。
// IApplicationクラス
public class Bio extends IApplication {
public void start(){
myCanvas ap = new myCanvas(this);
Display.setCurrent(ap);
}
}
iアプリのアプリケーションとしての機能を持ったクラスでiアプリの起動用クラス。
必ずstart()から始まります。
表示用のクラスのインスタンスを作るときIApplicationのインスタンス「this」をパラメータで渡しています。
「Display.setCurrent(ap)」で作成したCanvasのインスタンスを画面に表示しています。
//Canvasクラス
class myCanvas extends Canvas {
Canvasクラスを継承して低レベルAPI(画像、線、文字)が使えるようにしています。
int sin[] = {0,17,35,52,70,87,105,122,139,156,174,191,208,225,242,259,276,292,309,326,
342,358,375,391,407,423,438,454,469,485,500,515,530,545,559,574,588,602,
616,629,643,656,669,682,695,707,719,731,743,755,766,777,788,799,809,819,
829,839,848,857,866,875,883,891,899,906,914,921,927,934,940,946,951,956,
961,966,970,974,978,982,985,988,990,993,995,996,998,999,999,1000,1000
};
Font font;
Image im;
Calendar cal1,cal2;
Date dt1,dt2;
iアプリはsin関数や小数が扱えないため90度分のsinデータを1000倍して配列に入れています。
機種依存のなくすためのFontクラス、画像のためのImageクラス、日付を扱うためのCalendarクラス、Dateクラスを定義しています。
String platform = System.getProperty("microedition.platform");
if(platform.equals("SO503i")||platform.equals("D503i")){
font = Font.getFont(Font.FACE_SYSTEM | Font.STYLE_PLAIN | Font.SIZE_SMALL );
}else{
font = Font.getDefaultFont();
}
System.getProperty("microedition.platform")より携帯端末の機種が特定できます。
機種によってフォントサイズが異なるのでサイズを調整しています。
Calendar cal1,cal2;
Date dt1,dt2;
cal1 = Calendar.getInstance(); //今日
dt1 = cal1.getTime();
Calendar.getInstance()で現在日時を取得しています。
cal1.getTime()で1970/1/1 0:00:00から1/1000秒単位の形にかえています。
// イベント処理のためのメソッド
public void processEvent(int type, int param){
long n;
//ボタンが押された時
if(type == Display.KEY_PRESSED_EVENT){
work="";
if (param == Display.KEY_SOFT2){
writeData();
iApp.terminate();
イベント処理のためのメソッドです。typeに行われた動作、paramにパラメータが入ります。
この場合はソフトキー2が押された場合の処理を行っています。
処理内容はデータを保存した後、アプリケーションを終了しています。
//角度からグラフの高さを返す
public int calcSin( int sn ) {
int rst=0;
if ((sn>=0) && (sn<=90)){
rst = (-1)*sin[sn];
} else if ((sn>90) && (sn<=180)){
rst = (-1)*sin[180-sn];
} else if ((sn>180) && (sn<=270)){
rst = sin[sn-180];
} else if ((sn>270) && (sn<=359)){
rst = sin[360-sn];
}
return rst*(h-16)/2000+(h-16)/2;
}
sinデータが90度分しかないのでそれ以外の場合も返すようにしています。
戻り値は画面の高さから文字表示分を引いた高さを出し、原点を左上にして返しています。
//日付、周期からグラフ描画配列を計算
public int calcGrf( long dt, int cyc ) {
int i;
for (i=-7;i<9;i++) {
gx[i+7] = w / 15 * (i + 7);
gy[i+7] = calcSin((int)((dt+i) % cyc)*360/cyc);
}
return gy[0]+8;
}
7日前から8日後までを計算しています。
drawPolylineで使用できるように配列に入れています。
戻り値は説明文を表示させるために一つ目の座標+文字の 高さ/2を返しています。
//日付の妥当性チェック
public boolean chkDate() {
if (month>12 || day>31) return false;
if (day==31 && (month==4||month==6||month==9||month==11)) return false;
if (day>=30 && month==2) return false;
if (day==29 && month==2 && (year%4!=0 || year%100==0)) return false;
return true;
}
カレンダークラスは13月や40日を指定しても自動的に計算するので問題ないのですが。
一般的ではないのでありえない日付を指定された場合はfalseを返しています。