Garminウォッチフェイスの作成-タップ処理の実装

画面をタッチ操作できるウォッチで、それをウォッチフェイス内で利用できる方法について記載。

概要

画面のタッチ(タップ)操作を検知するのには、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側にタップで、ゴールステップ/昇降階数とバッテリー/高度の切り替えを行うようにしたので、その処理を上のような実装で行っている。

コメント

タイトルとURLをコピーしました