書くことないです。

ayamadoriが独り言を呟く日記。

PiClipをSeries 40 full touch端末に特化してみるテスト。その1?

前にPiClipをAsha 305により良く対応させるとか書いてたけど、それが一応形になってきたのでメモ。
こんな感じ。
f:id:ayamadori:20120826171447p:image
起動時(左)→画面タップでキーボード出てくる(中)→キーボード下スワイプで予測候補拡大(右)
公開しているPiClipからの変更点は

  • 辞書内蔵版のみ
  • 外観を純正のIM/GUIに近づける
  • 各種設定項目を削除
  • 文字削除はPOUND(#)キー*1
  • 入力モード切替はSTAR(*)キー
  • 予測候補はタップで確定
  • カーソルはフリックで移動(これは変わってない?)ドラッグで移動
  • 文章作成後の動作(クリップボードに送る・SMS送信・TwitterGoogle検索Bing検索)
  • 簡易学習機能追加(一定数の選択結果のみ反映する)
  • その他細かい部分

といったところか。
問題点は大有りwで、

  • 画面が遷移時にちらつく
  • 起動が遅い
  • レスポンスが悪い
  • 表示できる予測候補が少ない
  • クリップボードに送るとアプリが落ちる。もっとも現状の305にはペースト機能がないから、この機能自体に意味が無いw
  • Twitterは事前にブラウザでログインしておけば大丈夫だと思ってたのにそもそもブラウザアクセスが弾かれる。ただこのとき利用されるブラウザはWebkitのほう。日本語もばっちり。
  • Google検索は多分大丈夫だけど、やっぱりブラウザアクセスが怪しい。文字化けするのでBing検索に変更

などなど色々ひどい。だがしかしファイルは上げた。

https://sites.google.com/site/ayamadori/piclip/PiClipFT_alpha.jar?attredirects=0&d=1

ちなみにPiClipIDと同じく節約辞書が入っているけど、メモリ不足でアプリが落ちる可能性が高い。pbdic102に差し替える*2必要があるかも。

(ここから開発系)
Nokia UI API周り、その他Nokia依存っぽい部分をを試してみて色々分かったのでまとめる。

Clipboard

Touch and Type端末のときと同様、エミュレータ上で

copyToClipboard()

を利用すると

java.lang.IllegalAccessException

を吐いて落ちる。

IconCommand

上の写真中画面右上に表示されるアイコンボタン。一番使用頻度が高いコマンドを設定する。任意の画像を利用することもできるし、メジャーなものは最初から用意されている。上で表示しているチェックマークな"OK"アイコンもその1つ。
MIDPのCommandクラスを継承していて、外観以外は完全互換なので

CommandListener.commandAction()

なんかもMIDPと全く同じソースでOK。
Back/ExitキーはCommand作成時に

Command.BACK

Command.EXIT

を指定しておけば、自動的に上のように画面右下にアイコン表示される。(IconCommandでなくて良い)
Back/Exitキーはキーボード表示時は上のように自動的に隠れる。
なお、この位置以外にBack/Exitキーを置くのはUIガイドライン違反。

VirtualKeyboard

前回調べた通り。VKBの表示/非表示が切り替わるたびに画面サイズが変わり、それに伴って

Canvas.sizeChanged()

が呼ばれる。(呼ばなくすることも可能)

DirectUtils

標準MIDPでは大中小の3種類の大きさのフォントしか呼べないが、

DirectUtils.getFont(int face,int style,int height)

で任意の大きさ(高さ)のフォントが呼べる。
ついでに今回のVer1.6から細身のフォント(STYLE_LIGHT)が呼べるようになった。

Gesture API

フリックやタップ、ピンチなどのジェスチャを認識する。使用例はこんな感じ
大まかには
GestureInteractiveZoneインスタンスを作成→認識する領域を設定→認識された場合の動作を指定
というように進めるのだけど、問題は認識できる領域(インスタンス)の数に制限があること。この数は

GestureRegistrationManager.MAX_SUPPORTED_GESTURE_INTERACTIVE_ZONES

で取得できるが、現状では10に設定されている。インスタンスを10個以上作成しても、11個目以降の領域ではジェスチャを認識してくれない。今回のようにタップ領域を30個以上設定したい場合には数が足りないので、結局大きめに領域を設定して『認識された場合の動作』の中で独自に実装していく必要がある。
あるいは

Canvas.pointerPressed(),pointerReleased(),pointerDragged()

あたりも同時に呼べるので、こちらで実装するのもありかも。

GestureEvent.GESTURE_DRAG

は指を離さなくても呼ばれる。1回のドラッグの間に何度も呼ばれるし、座標がまちまちだったりするので、ある一定のサンプル間隔で呼んでるのかな?計測してみたけど最短で15〜20msecだった。ゆっくりドラッグすると当然間隔も伸びる。

Splash Screen

APIじゃないですが。
Javaアプリも純正アプリと同じSplash Screenが表示される*3
Splash Screenが表示されるのは

Display.setCurrent()

が最初に呼ばれるまで。したがって時間の掛かる初期化処理を別スレッドで動かしていると、Splash Screenを上手く表示させ続けられない。対策としてはメインスレッド(コンストラクタの中とか)で初期化処理を行う。でもこれあんまり上手い処理じゃないよね。。。もっと良い手がありそう。

MIDlet.platformRequest(String URL)

これは標準MIDPですが。
”http://"、”https://"で始まるURLを投げるとブラウザが起動する。普通にブラウザを起動した場合とCookieを共有できるかは不明。
"mailto:hoge@hoge.com?subject=foo&body=bar"でmessageアプリ(SMS/MMS)が起動できる。しかしsubjectやbodyにURLエンコード文字列(あるいはURLエンコードなしの日本語)を設定するをと、"Response unknown"と表示されて起動できない。bodyがasciiならOK。これができると送信SMSがmessageアプリのトレイに残せるから良いんだけどな。要継続調査。
あと、ブラウザ起動した後に元のアプリには戻れない。ブラウザのBackキーを押すとアプリ自体を終了するか確認してくる。ブラウザ右下のBackキーで戻れる。

テーマカラーの取得

Series 40のデフォルトテーマは今まで結構カラフルなのが多かったけど、Full Touch端末では固定の黒背景と、カラフルなボーダーや一部文字*4で構成されている。で、この色コードを取得するには

Display.getColor(Display.COLOR_HIGHLIGHTED_BORDER)

でOK。こうしておくと具体的な色コードを気にする必要がなくなるし、テーマ色を変えると(例えば茶色)自動的に反映してくれる。

*1:同時に逆トグル機能廃止

*2:jar解凍→word.utf8差し替え→再圧縮

*3:Manifest編集により、任意の画像に変更することも可能

*4:上の画像で言う[かな]の青色がそれ。この部分の色はテーマに依存し、アプリ内で変更できない