Processingで無理やりAndroidWearのWatchFaceをつくる話
AppleWatchでましたね.
誰か買ってください.Androidユーザですが,欲しいです.
研究室で借りているAndroidWear.そういえばWatchFaceつくろうと思って先延ばしにしていた.
せっかくのゴールデンウィーク,組んでみますかね.
という一連の流れの成果報告.
覚えている限りで書く.何か不足があれば@3846masaへ.
ProcessingでWatchFaceを作る方法(非推奨)
注)ActivityをつかったWatchFaceは非推奨です.でも,これしかできなかった orz
前準備
AndroidModeを使えるようにしておく.
- SDK4.4W.2(API20)も入れておく.
${ANDROID_SDK}\extras\google\m2repository\com\google\android\support\wearable\1.0.0\wearable-1.0.0.aar
をどこかにコピーする.wearable-1.0.0.aar
を展開して,R.txt
とclasses.jar
を取り出す.wearable-1.0.0.aar
の拡張子を.zip
に変えると展開しやすい.
classes.jar
を展開する.- 同上.
R.txt
をR.java
に書き換える.
int attr circle_border_color 0x7f010005
これを,こうする.
package android.support.wearable; public final class R { public static final class attr { public static final int circle_border_color = 0x7f010005; // anything } // anything }
出力された .class ファイルをclasses\android\support\wearableの中に入れる.
classes内のファイルをzipに圧縮して,ファイル名を
watchface.jar
とかにする.AndroidModeで作ったプロジェクトに
watchface.jar
をドロップする.一旦プロジェクトを保存して閉じる.
プロジェクトフォルダ内にある
AndroidManifest.xml
を以下に書き換える.- {ProjectName}には,プロジェクトの名前を入れる.
- {lowerProjectName}には,プロジェクトの名前を小文字で入れる.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="processing.test.{lowerProjectName}"> <uses-sdk android:minSdkVersion="20"/> <uses-permission android:name="com.google.android.permission.PROVIDE_BACKGROUND"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <application android:debuggable="true" android:icon="@drawable/icon" android:label="{ProjectName}" android:screenOrientation="portrait"> <activity android:allowEmbedded="true" android:name=".{ProjectName}"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="com.google.android.clockwork.home.category.HOME_BACKGROUND"/> </intent-filter> <meta-data android:name="com.google.android.clockwork.home.preview" android:resource="@drawable/icon"/> </activity> </application> </manifest>
- プロジェクトを開いて,下のコードを貼り付ける.
- メインのコードとは分けて書いておくといいかも.
import android.support.wearable.view.WatchViewStub; import android.view.Window; import android.os.Bundle; boolean isAmbient = false; @Override public void onCreate(Bundle b) { super.onCreate(b); Window window = getWindow(); WatchViewStub stub = new WatchViewStub(this); window.setContentView(stub); stub.addView(surfaceView, sketchWidth(), sketchHeight()); stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() { public void onLayoutInflated(WatchViewStub stub) { } }); } @Override protected void onStart() { super.onStart(); isAmbient = false; } @Override protected void onPause() { super.onPause(); paused = false; handleMethods("resume"); resume(); } @Override protected void onStop() { super.onStop(); isAmbient = true; }
- あとは普通に書けばよい.
注意点
- size()を利用してはならない.
- 落ちます.
- isAmbientで非アクティブモード(通称:Ambient Mode)を判定できます.
- trueで非アクティブモード
- 非アクティブモードでは,1分に1度しか再描画されない.
- 通知がくると画面の下半分が隠れる.
- 非アクティブモードでは,下半分を黒色にすることを推奨.
- 非アクティブモードの通知は透過がされないので,通知の背景が一部黒色.
- WatchFaceが黒色でないと,とてもダサくなる.
- 非アクティブモードでは,下半分を黒色にすることを推奨.
- この方法は非推奨.
- ActivityをつかったWatchFaceは非推奨.
- PAppletはActivityを継承しているので,他の方法がわからない.
- もしかしたらストアで販売できないかも?(わからない
とりあえず自分だけのWatchFaceをProcessingでつくれる.
WatchFaceModeでもつくろうかと思ったけど,いろいろ厳しかったので一旦断念.
また時間があれば挑戦するかも.