
F900iTは、タッチパネルとBluetoothを搭載した非常に個性的な携帯電話です (その分ずいぶんと大きいですが)。しかしF900iTはマイナーなのか タッチパネルを使ったiアプリは数えるほどしかないという状況に加えて、 iアプリからタッチパネルを使う方法を解説したページもほとんどないです。 そのため今回はタッチパネルをiアプリから 使用する方法を説明したいと思います(基本的なiアプリの作成方法は説明しませんので、 それについては他のページや本などを参考にしてください)。
"iアプリコンテンツ開発ガイド for DoJa-3.5各機種オプションAPI・拡張API実装状況" を見てもらえば分かるように、F900iTはPointingDeviceクラス(ポインティングデバイス、位置決め装置機能を定義したクラス) 内のAPI(の一部)を実装していることがわかります。 そしてそのクラスの名前からも分かるようにPointingDeviceを使うことでタッチパネルを 使うことが出来ます。今回は簡単なサンプルプログラムを示しながら説明していきます (http://mopeopage.hp.infoseek.co.jp/i/から実際にダウンロードして確かめることもできます)。
それでは具体的な使用法について説明したいと思います。
これから先は"iアプリコンテンツ開発ガイド for DoJa-3.5 オプション・拡張APIリファレンス編"
と一緒に見ると理解しやすいと思います(むしろこんな素人の書いた解説よりも
iアプリコンテンツ開発ガイドだけ読めば十分だと思いますが)。
さてタッチパネルを使うことで必要なことは次の二点だけです。
(1)動作モードの設定
(2)通知されるイベントの処理
これ以外は、Canvasを使った普通のiアプリとまったく変わるところはありません。
イベントの処理も通常のiアプリと同様processEventで行います。
サンプルプログラムは、TouchPanel(本体)とTouchPanelCanvas(キャンバス)の 二つのクラスからなっています。まず動作モードの設定は、リスト1に示すTouchPanelCanvasクラスの コンストラクタ(11行目〜20行目)で行っています。
TouchPanelCanvas(){
width = Display.getWidth();
height = Display.getHeight();
g = getGraphics();
PointingDevice.setMode(PointingDevice.MODE_MOUSE);
PointingDevice.setVisible(false);
PointingDevice.setEnabled(true);
b = false;
}
まずは、動作モードの設定を行います。F900iTではマウスモードをサポートしているので、 setMode(PointingDevice.MODE_MOUSE)メソッドでマウスモードにします。なおマウスモードはポインタの位置の取得、ポインタの表示・非表示等 が設定可能なモードです。
次にsetVisible(false)でポインタを画面に表示しない設定します。なお F900iTではsetVisible(true)にしてもポインタは表示されないのでこの処理は無くてもよいのですが 念のためポインタを表示しない設定にしておきます。
最後にポインティングデバイスを有効にするためにsetEnabled(true)を呼んで設定は完了です。 これでポインティングデバイスに関するイベントがprocessEventに通知されるようになります。
ポインティングデバイス関連のイベントは、少々複雑です。 詳しくはiアプリコンテンツ開発ガイドを読んでもらうとして簡単にまとめると 図1のようになります。
このため二つの注意点があります。一つ目は「通常のSELECTキーに関するイベントなのか、タッチパネルに 関するイベントなのか場合分けしなければならないこと」。二つ目は 「押下・解放イベントしか通知されないのでドラッグなどの処理は自分で考えなければならないこと」です。 二つ目に関しては今回は説明しませんが、ドラッグに関してはタイマーを使うなどの方法が考えられます。
リスト2にイベント処理に関するコードを示します。 Display.POINTER_MOVED_EVENTが通知されたときにb=trueにし、その後Display.KEY_PRESSED_EVENT 通知の際にはb=trueならタッチパネルに関するイベント、違うなら実際のSELECTキーに関するイベント と判断しています。Display.KEY_RELEASED_EVENTも同様に処理をしています(このときにb=falseにしています)。 またポインティングデバイスの位置を取得するにはPointingDevice.getX()、PointingDevice.getY() を使います。
public void processEvent(int type, int param){
int x, y;
switch(type){
case Display.POINTER_MOVED_EVENT: // ポインティングデバイスの操作開始の通知イベント
b = true;
break;
case Display.KEY_PRESSED_EVENT: // キー押下を表すイベント
if(param == Display.KEY_SELECT && b == true){
x = PointingDevice.getX();
y = PointingDevice.getY();
g.lock();
g.clearRect(0, 0, width, height);
g.drawString("押下 " + x + "," + y, x, y);
g.unlock(true);
}
break;
case Display.KEY_RELEASED_EVENT: // キー解放を表すイベント
if(param == Display.KEY_SELECT && b == true){
x = PointingDevice.getX();
y = PointingDevice.getY();
g.lock();
g.clearRect(0, 0, width, height);
g.drawString("解放 " + x + "," + y, x, y);
g.unlock(true);
b = false; // ポインティングデバイスの操作終了
}
break;
}
}
リスト3、4に全ソースコードを示します。
import com.nttdocomo.ui.*;
public class TouchPanel extends IApplication {
//アプリの開始
public void start() {
Display.setCurrent(new TouchPanelCanvas());
}
}
import com.nttdocomo.ui.*;
import com.nttdocomo.opt.ui.*;
class TouchPanelCanvas extends Canvas
{
int width, height;
Graphics g;
boolean b;
// コンストラクタ
TouchPanelCanvas(){
width = Display.getWidth();
height = Display.getHeight();
g = getGraphics();
PointingDevice.setMode(PointingDevice.MODE_MOUSE);
PointingDevice.setVisible(false);
PointingDevice.setEnabled(true);
b = false;
}
public void processEvent(int type, int param){
int x, y;
switch(type){
case Display.POINTER_MOVED_EVENT: // ポインティングデバイスの操作開始の通知イベント
b = true;
break;
case Display.KEY_PRESSED_EVENT: // キー押下を表すイベント
if(param == Display.KEY_SELECT && b == true){
x = PointingDevice.getX();
y = PointingDevice.getY();
g.lock();
g.clearRect(0, 0, width, height);
g.drawString("押下 " + x + "," + y, x, y);
g.unlock(true);
}
break;
case Display.KEY_RELEASED_EVENT: // キー解放を表すイベント
if(param == Display.KEY_SELECT && b == true){
x = PointingDevice.getX();
y = PointingDevice.getY();
g.lock();
g.clearRect(0, 0, width, height);
g.drawString("解放 " + x + "," + y, x, y);
g.unlock(true);
b = false; // ポインティングデバイスの操作終了
}
break;
}
}
public void paint(Graphics g){
}
}