旅に出たり、走ったり、旅に出て走ったり

走った記録や旅行記、旅ランの記録などを書いています。Garminなどのランガジェットの紹介もします。

【ConnectIQプログラミング5】Widgetの構築。まずはApp.mcのコーディング

今日はかなり大雨でしたね。こんな日は走りません。風邪引くわけにもいきません。

さて、誰が見ているのか分からないこのシリーズ。インターネットの世界の不良資産にでもなってくれればという思いで書き綴っていきます。

 

前回の記事はこちら。 

genmaigenmai.hatenablog.com

 

 

プロジェクトにあるソースの構成

Widgetの構築です。プロジェクトを新規構築した時には、クラスは2種類できてきました。1つ目のGenmaiWebHooksWidgetApp.mc(Appクラス)が、Widgetのコントロールを行うメインのプログラム。2つ目のGenmaiWebHooksWidgetView.mc(Viewクラス)が画面表示を行うプログラムです。実はもう一つ必要なんですが、それはまた後述。

f:id:Genmai_17:20200329134938p:plain

今日は、まず最初のAppソースを編集しておこうと思います。

Appクラスの構造

AppクラスはToybox :: Application :: AppBaseを継承して作られています。AppBaseの説明を公式で見るとこうなっています。

すべてのアプリはこのクラスを継承し、そのメソッドを使用してアプリのライフサイクルを管理します。

  • ウィジェットとウォッチアプリの場合、これらの関数は次の順序で呼び出されます。
  1. onStart()
  2. getInitialView()
  3. onStop()

Widgetに関係する部分のみをGoogle翻訳の結果から抜粋)

 onStart()で必要であれば初期化し、getInitialView()で表示と操作のクラスを与えて、onStop()で後始末をするんだなってことが分かります。

プロジェクトの新規構築直後のソースはこんな感じになってます。

using Toybox.Application;

class GenmaiWebhooksWidgetApp extends Application.AppBase {

    function initialize() {
        AppBase.initialize();
    }

    // onStart() is called on application start up
    function onStart(state) {
    }

    // onStop() is called when your application is exiting
    function onStop(state) {
    }

    // Return the initial view of your application here
    function getInitialView() {
        return [ new GenmaiWebhooksWidgetView() ];
    }

 

initialize()は、解説が無いのでよく分かりませんが、コンストラクタのようです。中身は親を呼んでいるだけです。

onStart()とonStop()は、特に触らなくて良さそうです。

getInitialView()は、Viewクラスをnewして、そのままリターンしています。これでViewクラスがどれなのかを時計に知らせているんですね。

Appクラスの編集

編集するのは、getInitialView()になります。公式によるとこんな感じです。

getInitialView ⇒ Toybox::Lang::Array

オーバーライドして、アプリケーションの初期WatchUi.Viewおよび WatchUi.InputDelegateを提供します。

WatchUi.InputDelegateの提供は、ウィジェットとウォッチアプリではオプションです。

ウォッチフェイスとデータフィールドの場合、これらのアプリタイプでは使用できないため、WatchUi.Viewのみを含む配列 が返されます。

戻り値: (Toybox :: Lang :: Array) — WatchUi.Viewおよびオプションの WatchUi.InputDelegateを含む配列

 

 

それでは、オプションのWatchUi.InputDelegateってなんなのかと言うと、時計のボタン操作を受け付けるクラスのようです。これを使って時計のボタン操作を受け付けるクラスを作るんですね。

inputDelegateを調べてみると、時計のボタン操作、タッチスクリーンのタップ・スワイプなどの物理的な操作を拾うことができるようです。ただ、ボタンの配置やタッチパネルの有無など機種依存になるので、プログラミングがめんどくさい。

他にいいのが無いかなと探していると、BehaviorDelegateというクラスを発見。こちらは選択、メニュー、進む、戻るなど論理上の操作を拾えるようです。これだと機種に共通した動作で作れるので、使いやすそう。

これを継承した新規クラスを格納するファイルを作ります。

f:id:Genmai_17:20200412174011p:plain

まだ、中身はからっぽです。(初期化関数すら書いてないので、警告出ます。)

using Toybox.WatchUi as Ui;


class GenmaiWebHookWidgetDelegate extends Ui.BehaviorDelegate {

}

さてと、では、Appコードを修正かけます。

これで行けるはず。

    function getInitialView() {
        var view = new GenmaiWebHookWidgetView();
        var delegate = new GenmaiWebHookWidgetDelegate();
        return [ view, delegate ];
    }

エラーは無かったので、これで行けたようです。

まだまだ続きます。

genmaigenmai.hatenablog.com

 

にほんブログ村 その他スポーツブログ マラソンへ
にほんブログ村