1

最近、Android Wear ウォッチフェイスにアンビエント モードを実装しようとしましたが、いくつかのコーディングを実装した後、アンビエント モード (エミュレータ) に切り替えたときに onAmbientModeChanged が呼び出されないことがわかりましたが、通常モードにすると、最初のトリガー、inAmbientMode が 2 回呼び出されます。 2 番目のトリガー inAmbientMode は false です。

private class Engine extends CanvasWatchFaceService.Engine {
    ...
    ...
     @Override
     public void onAmbientModeChanged(boolean inAmbientMode) {
        Log.e(TAG, "isInAmbientMode():" + inAmbientMode);
        super.onAmbientModeChanged(inAmbientMode);
        if (mLowBitAmbient) {
            boolean antiAlias = !inAmbientMode;
            setPaintAntiAlias(antiAlias);
        }

        invalidate();
        updateTimer();
    }

    @override
    public void onDraw(Canvas canvas, , Rect bounds){
      ...
      for(int i=0;i<node.length;i++){
        //drawing canvas
      }
    }
}

AndroidManifest.xml

<uses-permission android:name="com.google.android.permission.PROVIDE_BACKGROUND" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET"/>

アンビエントがオンのときにトリガーされない問題は何ですか? それはバグですか、それともこれをトリガーするためにいくつかの権限またはクラスを追加する必要がありますか? どんな助けでも大歓迎です。

EDIT:アンビエントの場合、ウォッチフェイスは通常モードに戻るまで再描画されません。その後、ウォッチフェイスはアンビエントウォッチフェイスを描画してから、通常のウォッチフェイスのみを描画します

何かのテストとデバッグを行った後、for ループが onAmbientModeChanged をトリガーしなかった主な原因であることがわかりました。for ループをコメントアウトした後、アンビエントの変更時に onAmbientModeChanged も正しくトリガーされますが、理由はまだわかりません。それが起こり、解決します。

4

2 に答える 2

0

onTick()マシュマロの更新後、OSがウォッチフェイスを数ミリ秒間ウェイクして時間を更新するまで、ウォッチフェイスがランダムにアンビエントモードにならないという同様の問題が発生しました。この問題は、Doze モードを使用したウェアラブルのより積極的なスリープ ポリシーに関連していると思います。

WatchFaceServiceAndroid Studio によって逆コンパイルされたコードを調べたところ、 Jetbrains Java バイトコード逆コンパイラがバンドルされonTick()てい100msます。コールバックで同じことをしようとしましたがonAmbientModeChanged()、アンビエント モードで対話型スタイルのウォッチ フェイスを見たことはありませんでした。

コード スニペットは次のとおりです。

onCreate()

final PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mWakeLock.setReferenceCounted(false);

onAmbientModeChanged(…)

mWakeLock.acquire(100L);

たとえば、ウェイクロック取得時間の値を 10ms に設定し、ウォッチフェイスをタップするたびに 10ms ずつ増加させることで、微調整を試みることができます。

ウォッチフェイスがアンビエントモードの切り替えをアニメーション化するので、私は個人的にこの値をより適切なものに変更しました。

ところで、モバイルデバイスでのパフォーマンスが重要であるため、実行するのに長すぎないと言った回数だけ繰り返される for ループ内のコードを確認してください。私は個人的にウォッチフェイスに目盛りを描画するための for ループを持っていましたが、最初に一度作成して にキャッシュすることでスムーズになり、代わりBitmapに使用することにしました。Canvas#drawLines(…)

于 2016-04-24T14:36:31.507 に答える