1

最近我尝试在android wear watchface中实现环境模式,在实现了一些编码后,我发现在进入环境模式(模拟器)时不会调用onAmbientModeChanged,但在切换到普通模式时会调用两次,第一次触发,inAmbientMode为真,第二次触发 inAmbientMode 为假。

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"/>

环境开启时不触发会有什么问题?这是一个错误还是我需要添加一些权限或类来触发它?任何帮助,将不胜感激。

编辑:当环境时,表面不会重绘,直到它回到正常模式,然后表面将绘制环境表面然后只绘制正常表面

经过测试和调试,我发现for循环是没有触发onAmbientModeChanged的主要原因,注释掉for循环后,当环境变化时,onAmbientModeChanged也会正确触发但仍然不知道为什么它发生和解决方案。

4

2 回答 2

0

我遇到了类似的问题,在 Marshmallow 更新后,我的表盘不会随机变为环境模式,直到onTick()操作系统将表盘唤醒几毫秒以更新时间。我猜这个问题与可穿戴设备上更激进的睡眠政策有关,带有打盹模式。

我查看了WatchFaceService由 Android 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);

您可以尝试微调唤醒锁获取时间值,例如将其设置为 10 毫秒,并使其每次点击表盘时递增 10 毫秒。

我个人将此值更改为更合适的值,因为我的 Watch Face 动画环境模式切换。

顺便说一句,检查 for 循环中的代码是否重复了你告诉它执行的时间不会太长,因为在移动设备上的性能至关重要。我个人在我的表盘中有一个 for 循环来绘制刻度,但我首先将它制作一次并将其缓存在 a 中以使其更平滑Bitmap,现在,我将使用它Canvas#drawLines(…)

于 2016-04-24T14:36:31.507 回答
0

在我的带有 USB 连接的 Polar M600 上,我没有收到 onAmbientModeChanged() 调用,并且 isInAmbientMode() 也不起作用。

如果没有 USB 连接 onAmbientModeChanged() 和 isInAmbientMode() 就不能可靠地工作(通常不是这样)。

我的技巧是使用:

onTapCommand() 用于设置 mAmbient = true (我自己调用 onAmbientModeChanged(true) )(第一次点击被消耗以唤醒时钟,但如果我需要更多信息,我会再次点击)

onTimerTick() 用于设置 mAmbient = false(我自己调用 nAmbientModeChanged(false))(最多延迟 1 分钟,但没关系)

为我工作。

于 2017-07-15T11:12:12.593 回答