このページの本文へ

車とスマホがつながるSDLの世界 第8回

SDLのライブラリを組み込み、車載機のユーザーインターフェースを実現してみよう!

SDL対応アプリ開発環境の構築その4~白紙のiOSプロジェクトから作るSDLアプリ

2019年01月13日 11時00分更新

文● 柴田文彦 編集●アスキー編集部

提供: トヨタ自動車株式会社

  • この記事をはてなブックマークに追加
  • 本文印刷

ステートが順繰りと変化するソフトボタンを設定する

 デフォルトのテンプレートの画面の底辺に近い部分には、まだ何も表示されていない。そのスペースは、タッチパネルを運転中に指で操作することを意識した大きめのソフトボタンのために用意されたものだ。スペースは横に広いものの、実際にはボタンは2つしか表示できない。このボタンのタイプは「イメージ」で、テキストは表示できず、画像だけが表示可能となっている。ここに2種類のボタンを配置することにしよう。

 1つは、ユーザーがタップすると、そのたびに順繰りとボタンのステートが変化し、それに応じてボタンの画像も変化していくもの。もう1つは、ステートは変化せず、ずっと同じ画像を表示したままだが、タップすることで車載機画面にアラートを表示するものとする。

 まずは、ボタンとして使用する画像をプロジェクトに追加する。最初のボタンは、3つのステートを持つことにするので、1つのボタンに対して3つの画像が必要となる。もちろん、2つめのボタンの画像は1つだけでいい。

 1つめのボタンの最初の状態では「○」のような画像を表示することにし、そのための画像を「okButton.png」として、128×128ピクセル程度のサイズで用意した。同様に1つめのボタンの次のステート用には「□」のような画像を「sqButton.png」として、その次のステート用には「△」のような画像を「trButton.png」として用意した。2つめのボタンについては「×」のような画像を「cancelButton.png」として用意した。これらはすべてXcodeのAssetsとしてプロジェクトに追加しておく(図14)。

図14:2つのボタン用の画像、合計4つのPNGファイルをプロジェクトに追加する。1つめのボタン用は「okButton」「sqButton」「trButton」の3つ、2つめのボタン用は「cancelButton」の1つだ

 車載機は、iOSのUIKitの標準のUIImageオブジェクトを直接表示することはできない。そこで、UIImageからSDL標準のSDLArtworkに変換してから使う。上でプロジェクトに追加した4つのPNG画像からいったんUIImageを作成し、さらにそこからSDLArtworkを作成するコードは以下のようになる。

let image1 = UIImage(named: "okButton.png")
let artwork1 = SDLArtwork(image: image1!, persistent: true, as: .PNG)
let image2 = UIImage(named: "sqButton.png")
let artwork2 = SDLArtwork(image: image2!, persistent: true, as: .PNG)
let image3 = UIImage(named: "trButton.png")
let artwork3 = SDLArtwork(image: image3!, persistent: true, as: .PNG)
let image4 = UIImage(named: "cancelButton.png")
let artwork4 = SDLArtwork(image: image4!, persistent: true, as: .PNG)

 これにより、artwork1〜artwork4まで、4つのSDLArtworkオブジェクトが作成できた。次に、これらの画像に対応するボタンのステート(SDLSoftButtonStateオブジェクト)を作成する。とりあえず、1つめのボタン用の3つのステートを作成しよう。

let sbState11 = SDLSoftButtonState(stateName: "State11", text: "BS11", artwork: artwork1)
let sbState12 = SDLSoftButtonState(stateName: "State12", text: "BS12", artwork: artwork2)
let sbState13 = SDLSoftButtonState(stateName: "State13", text: "BS13", artwork: artwork3)

 ここまでで、sbState11〜sbState13まで、3つのステートが作成できたので、さらにそれらを指定して、1つめのソフトボタンのオブジェクト(SDLSoftButtonObject)を作る。その際には、ボタンの名前、含むステート、最初のステートを指定し、ボタン操作に対する応答まで含めて一気に定義する。

let sbObj1 = SDLSoftButtonObject(name: "Button1", states: [sbState11, sbState12, sbState13], initialStateName: "State11") { (buttonPress, buttonEvent) in
    guard buttonPress != nil else { return }
    print("Button 1 Pressed!")
    let sbObj = self.sdlManager.screenManager.softButtonObjectNamed("Button1")
    sbObj?.transitionToNextState()
}

 この例では、ボタンのプレスに対して、コンソールへのログ出力に加えて、そのボタンオブジェクトのtransitionToNextState()メソッドを使って、ボタン自身のステートを次に移行させている。ステートは3つだけなので、3番めのステートの次は1番めのステートに戻る。

 とりあえず、この1つめのボタンだけを設定して動かしてみよう。ボタンオブジェクトも、スクリーンマネージャのプロパティとして設定できる。同時に複数のボタンを配列として指定できるが、ここでは要素が1つだけの配列で、1つめのボタンだけを設定する。

sdlManager.screenManager.softButtonObjects = [sbObj1]

  以上のボタンに関するコードも、すべてスクリーンマネージャのbeginUpdates()とendUpdates {}の間に入れる。アプリを起動して車載機のアプリ固有の画面に切り替えると、今度は画面の底部に「○」のボタンが表示されている(図15)。

図15:1つめのボタンだけを設定してからアプリを動かすと、ボタンは車載機画面の底部中央に配置される

 そして、このボタンをクリックするたびに、ボタンの画像は「○」→「□」→「△」→「○」... のように順繰りと切り替わることが確認できる(図16)。

図16:車載機のボタンをクリックすると、ボタンのステートが順繰りと切り替わり、それに対応して各ステートに設定してあるボタンの画像も切り替わる

カテゴリートップへ

この連載の記事

ASCII倶楽部

注目ニュース

  • 角川アスキー総合研究所

プレミアム実機レビュー

ピックアップ
1
Anker PowerLine III Flow USB-C & USB-C ケーブル Anker絡まないケーブル 240W 結束バンド付き USB PD対応 シリコン素材採用 iPhone 17 / 16 / 15 / Galaxy iPad Pro MacBook Pro/Air 各種対応 (1.8m ミッドナイトブラック)
Anker PowerLine III Flow USB-C & USB-C ケーブル Anker絡まないケーブル 240W 結束バンド付き USB PD対応 シリコン素材採用 iPhone 17 / 16 / 15 / Galaxy iPad Pro MacBook Pro/Air 各種対応 (1.8m ミッドナイトブラック)
¥1,890
2
Anker USB Type C ケーブル PowerLine USB-C & USB-A 3.0 ケーブル iPhone 17 / 16 / 15 /Xperia/Galaxy/LG/iPad Pro/MacBook その他 Android 等 USB-C機器対応 テレワーク リモート 在宅勤務 0.9m ホワイト
Anker USB Type C ケーブル PowerLine USB-C & USB-A 3.0 ケーブル iPhone 17 / 16 / 15 /Xperia/Galaxy/LG/iPad Pro/MacBook その他 Android 等 USB-C機器対応 テレワーク リモート 在宅勤務 0.9m ホワイト
¥740
3
CIO フラットスパイラルケーブル CtoC 1m (Type-C/USB-C) PD 急速充電 平型 磁石 マグネット吸着 まとまる 充電ケーブル PD 240W データ転送 480Mbps (ライトブラック, 1m)
CIO フラットスパイラルケーブル CtoC 1m (Type-C/USB-C) PD 急速充電 平型 磁石 マグネット吸着 まとまる 充電ケーブル PD 240W データ転送 480Mbps (ライトブラック, 1m)
¥1,980
4
エレコム 電源タップ 6個口 3m 雷ガード 個別スイッチ ほこりシャッター付 耐熱 PSE技術基準適合 ブラック T-K6A-2630BK
エレコム 電源タップ 6個口 3m 雷ガード 個別スイッチ ほこりシャッター付 耐熱 PSE技術基準適合 ブラック T-K6A-2630BK
¥2,111
5
Anker iPhone充電ケーブル PowerLine II ライトニングケーブル MFi認証 超高耐久 iPhone 14 / 14 Pro Max / 14 Plus / 13 / 13 Pro / 12 / 11 / X/XS/XR / 8 Plus 各種対応 (0.9m ホワイト)
Anker iPhone充電ケーブル PowerLine II ライトニングケーブル MFi認証 超高耐久 iPhone 14 / 14 Pro Max / 14 Plus / 13 / 13 Pro / 12 / 11 / X/XS/XR / 8 Plus 各種対応 (0.9m ホワイト)
¥990
6
【Amazon.co.jp限定】 ロジクール 静音 ワイヤレス トラックボール マウス M575SPd Bluetooth Logibolt 無線 windows mac iPad OS Chrome トラックボールマウス ブラック M575 M575SP 国内正規品 ※Amazon.co.jp限定 壁紙ダウンロード付き
【Amazon.co.jp限定】 ロジクール 静音 ワイヤレス トラックボール マウス M575SPd Bluetooth Logibolt 無線 windows mac iPad OS Chrome トラックボールマウス ブラック M575 M575SP 国内正規品 ※Amazon.co.jp限定 壁紙ダウンロード付き
¥7,040
7
Verbatim バーベイタム 1回録画用 ブルーレイディスク BD-R 25GB 50枚+3枚増量パック インクジェットプリンタ対応 ホワイト 片面1層 1-6倍速
Verbatim バーベイタム 1回録画用 ブルーレイディスク BD-R 25GB 50枚+3枚増量パック インクジェットプリンタ対応 ホワイト 片面1層 1-6倍速
¥2,480
8
UGREEN USB Type Cケーブル PD対応 100W/5A 超急速充電 USB C ナイロン編み 断線防止 iphone17/16/15シリーズ/iPad/MacBook Pro/Galaxy S24/Matebook/iPad/Xperia等USB-C各種対応(1m, ブラック)
UGREEN USB Type Cケーブル PD対応 100W/5A 超急速充電 USB C ナイロン編み 断線防止 iphone17/16/15シリーズ/iPad/MacBook Pro/Galaxy S24/Matebook/iPad/Xperia等USB-C各種対応(1m, ブラック)
¥1,299
9
Amazon Kindle - 目に優しい、かさばらない、大きな画面で読みやすい、6週間持続バッテリー、6インチディスプレイ電子書籍リーダー、ブラック、16GB、広告なし
Amazon Kindle - 目に優しい、かさばらない、大きな画面で読みやすい、6週間持続バッテリー、6インチディスプレイ電子書籍リーダー、ブラック、16GB、広告なし
¥19,980
10
KIOXIA(キオクシア)【日本製】USBフラッシュメモリ 32GB USB2.0 国内サポート正規品 KLU202A032GL
KIOXIA(キオクシア)【日本製】USBフラッシュメモリ 32GB USB2.0 国内サポート正規品 KLU202A032GL
¥980

Amazonのアソシエイトとして、ASCII.jpは適格販売により収入を得ています。

デジタル用語辞典

ASCII.jpメール デジタルMac/iPodマガジン