2005年03月07日

iアプリで、メモリー残量を表示する

実行時にメモリーの残りを表示する方法です。2chにありました。System.out.println(Runtime.getRuntime().freeMemory());としないのは、Systemオブジェクトの展開に使われるメモリーを考慮できないからだそうです。

System.out.println("");
System.out.println(Runtime.getRuntime().freeMemory());
'03.10.14

2005年01月09日

絵文字を表示する

iアプリプログラミング(Doja)で、iモードの絵文字をchar型として取り出す時は下記の様にします。
また、ディフォルトでは絵文字の色はGraphics.setColor()メソッドで指定できません。絵文字それぞれにディフォルトの色が決まっていて、その色で描画されます。端末で絵文字を表示したときのあの色です。
プログラム側から色を指定するには、Graphics.setPictoColorEnabled()メソッドを実行しておく必要があります。ただしこのメソッドはDoJa2.0からで、1.0では絵文字の色は制御できません。ちなみにN2002ではsetPictoColorEnabled()メソッドを使うと動かなくなりました。
// 改行マーク
char picto1 = (char)0xE6DA;
// 本マーク
char picto2 = '¥ue683';

Graphics g = getGraphics();

// 絵文字に色を付けられるようにする
// ただしDoJa2.0以降。N2002ではエラーが発生して動かなくなる
g.setPictoColorEnabled(true);
g.setColor(g.getColorOfName(g.BLACK));
g.drawString("改行マーク:" + picto1);
g.drawString("本マーク:" + picto2);

'03.11.14

2005年01月07日

iアプリで、画像を表示する

iアプリプログラミング(Doja)にて、GIFなどの画像を表示する方法です。

MediaManagerクラスのstaticメソッドを使ってMediaImageクラスを取得し、さらにMediaImageクラスからImageクラスを取得するという形になります。
MediaImageクラスのdisposeメソッドを呼び出すと同クラスから取り出したImageクラスは無効になるため、MediaImageクラスとImageクラスをセットで管理するのがいいかなと思います。

MediaManager.getImageメソッドに渡す引数は下記の様になります。DoJa3.0からはこれらのlocation指定以外にもバイト配列やストリームを使えます。

'04.2.23


リソースから読み込む場合

resource:///<jar-relative-path>

<jar-relative-path>
JARファイルに格納されたリソースの相対パスです。通常はプロジェクトフォルダ内のresフォルダをルートとする相対パスになります。


スクラッチパッドから読み込む場合

scratchpad:///<number>[;pos=<start-point>[,length=<access-length>]]

<number>
アクセスするスクラッチパッド領域の番号を指定します。スクラッチパッド領域の分割はDoJa3.0からの機能で、2.0以前では必ず0を指定します。
<start-point>
アクセスする位置を先頭からのバイト数で指定します。
<access-length>
アクセスする範囲を<start-point>からのバイト数で指定します。 通常は指定する必要はありませんが、MediaManagerクラスのメディアデータ取得メソッドにスクラッチパッドを指定する際に適切な値を指定するとパフォーマンスが向上する機種があるそうです。 また、<access-length>を指定する場合は必ず<start-point>も指定する必要があります。


MediaImage mi;
Image img;

// 画像の読み込み
try
{
  mi = MediaManager.getImage("resource:///image.gif");
  mi.use();
  img = mi.getImage();
}
catch (Exception e)
{
}

// 画像の表示(gは任意のGraphicsクラス)
g.drawImage(img, 0, 0);

// 使用終了時
try
{
  img.dispose();
  img = null;
  mi.unuse();
  mi.dispose();
  mi = null;
  System.gc(); // 念のためです。普通は要らないかと。
}
catch (Exception e)
{
}

2004年10月22日

iアプリJava(DoJa)と普通のJava(J2SE)の違い

iアプリとPCで同じプログラムを作らなきゃいけない場合、みなさんがこの違いをどうやってカバーしてるのか非常に気になります。Javaの意味ねーじゃんってぐらいAPIが全く違いますよね...
エミュレーターが作れれば一番早いですが小生にはそんな力はありません。

とりあえず小生はこんな感じで...
スクラッチパッドがない
これは仕方ないので、スクラッチパッドの代替ファイルを容易すればいいかなと。
ダイアログの出し方
iアプリのcom.nttdocomo.ui.Dialogはパソコンだとjavax.swing.JOptionPaneでなんとかなるんですが、めんどくさいですね。iアプリみたくシンプルならいいのに。DelphiでもMessageDlgとかで一発だし。 まぁiアプリのダイアログは動作が微妙なところがあるので使わないのが一番っぽいですが。
フォントの違い
iアプリではFontクラスから直接getAscent()、getDescent()等を呼び出せるのですが、普通のJavaで同等のメソッドはFontMetricsクラスにあります。 結局、共通のコードでいけるように新しいクラスを定義し、iアプリ用とパソコン用とそのサブクラスで対応しました。めんどくさーい。
色指定方法の違い
iアプリではGraphicsクラスだけで出来ることが、パソコン用ではColorクラスがあってまどろっこしいです。そんなに違わないのでラッパー関数てきなものでなんとかなりますけど。

この他にも細かい違いがたくさんあって(そもそもimportするパッケージが違うわけだし)、どっちにしろ今あるiアプリ用のコードが全然生かせず、作り直しです...

2003年10月13日

iアプリで、スクラッチパッドから文字列を読み込む

スクラッチパッドに保存された、Shift-JIS形式の文字列を取得します。文字列は先頭1byteに長さを記述した形式にするため、長さは255byteまでになります。
ちなみにこの関数で読み込めるデータを作成する処理はページ下にあります。Delphiの関数です。TMemoryStreamなどを使って下さい。引数はstringですが255byte以上あると例外を生成します。

// 文字列をスクラッチパッドから読み込む
private static String ReadString(int pos)
{
  InputStreamReader in = null;
  try
  {
    in = new InputStreamReader(
      Connector.openInputStream("scratchpad:///0;pos=" + pos));

    // 文字の長さの読み込み
    int i = in.read();
    StringBuffer sb = new StringBuffer(i);
    i = in.read();
    while (i >= 0 && (char)i != '¥t')
    {
      sb.append((char)i);
      i = in.read();
    }

    in.close();
    return sb.toString();
  }
#ifdef _DEBUG
  catch (ConnectionException ce)
  {
    System.out.println(
      "ConnectionException Status:" + ce.getStatus());
    return "connection exception";
  }
#endif
  catch (Exception e)
  {
    System.out.println(e);
    try { if (in != null) in.close(); } catch (Exception e2) {}
    return "error";
  }
}
// TStreamにShift-JIS形式の文字列を書き込む
procedure WriteString(Stream: TStream; const Value: string);
var
  ss: ShortString;
begin
  if Length(Value) + 1 > $FF then
    raise Exception.Create(
      IntToStr(Length(Value)) + 'バイト以上の文字列は書き込めません')
  else
  begin
    ss := Value;
    Stream.Write(ss, Length(Value) + 1);
  end;
end;

'03.10.13

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。