画面をタッチ操作できるウォッチで、それをウォッチフェイス内で利用できる方法について記載。
概要
画面のタッチ(タップ)操作を検知するのには、WatchFaceDelegateのonPressをオーバーライドする必要がある。
Toybox.WatchUi.WatchFaceDelegate
ちなみにonTapメソッドもあるのだけど、そちらはウォッチフェイスの設定モードでしか利用できない。ウォッチフェイス用として実装しても、画面をタップしても呼び出しはされない。
処理方法
呼び出しパラメータにClickEventを与えられる。ただこれで使用するのはgetCoordinates()で取り出した座標情報のみ。
もう一つgetType()でイベントタイプが入るのだけど、これは現状無視するのがベター。
理由は、ファームバージョンで結構ブレブレな感じだから。
まず、イベントとしてくるのはロングタップのみ。
ClickTypeの定義としては、タップ・ホールド・リリースと3種類あり、画面に触れたときにタップ、画面から指を離したときにリリース、長い間画面を触るとホールドが来るものだと思ったのだが、イベントとして処理されるのホールド(画面長押し)のみだった。
しかし、値としてくるのは、当初はホールドが来たが、最新はリリースが来ている。
(上記内容はシミュレーションでの動きのようだ)
最終的にはgetType()を無視しても、実機動作上は問題ないことは確認した。
座標値に関しては、DCで描画する場合の座標系と同じなので、それをもとに処理をするのがいい。
サンプル実装
以下のような感じ。
function onPress(pressEvent as ClickEvent) as Boolean {
var xy = pressEvent.getCoordinates();
if (enableShowFloors) {
if (xy[0] < center[0] && xy[1] > center[1]) {
// 左下タップで切り替え
showFloors = !showFloors;
Application.Properties.setValue(propShowFloors, showFloors);
return true;
}
}
if (xy[0] > center[0] && xy[1] > center[1]) {
// 右下タップで切り替え
showAltitude = !showAltitude;
Application.Properties.setValue(propShowAltitude, showAltitude);
return true;
}
return false;
}
DigiInfo側にタップで、ゴールステップ/昇降階数とバッテリー/高度の切り替えを行うようにしたので、その処理を上のような実装で行っている。
コメント