首页 > 解决方案 > 如何在 Wear OS 中将秒针手表在一秒钟内旋转五次?

问题描述

我正在开发一个表盘,想在 1/5 秒内将秒针旋转 1.2 度。

为什么会有这些数字?

1) 360 度/60 秒 = 6 度/秒

2) 6 度 / 5 = 1.2 度(在五分之一秒内旋转 1.2 度)。

下面是正常旋转(每秒 6 度)。

在此处输入图像描述

上图花费一秒钟旋转 6 度。

我的问题是:如何花五分之一秒旋转 1.2 度?

这是我的代码:

private void drawClassicSecondsHand(Canvas canvas) {

    final int seconds = (mCalendar.get(Calendar.SECOND));
    final float secondsRotation = seconds * 6;

    float originRadius = complicationHandBitmap.getWidth() / 2f;

    float secondsAreaCenterX = mCenterX - (float) (mCenterX * 0.45);
    canvas.rotate(secondsRotation, secondsAreaCenterX, mCenterY);
    classicSecondsComplication.draw(
            canvas,
            secondsAreaCenterX,
            mCenterY,
            classicComplicationRadius,
            complicationHandBitmap,
            originRadius);
}

onDraw以上方法在我的表盘服务的方法中调用。

public void onDraw(Canvas canvas, Rect bounds) {

   ...
   drawClassicSecondsHand(Canvas canvas);
}

标签: javawear-osandroid-wear-2.0watch-face-api

解决方案


我不确定onDraw现在从哪里调用您的方法,但是从电池寿命的角度来看,持续更新并不好。

如果您在 Android Studio 中创建一个新项目并选择 Wear OS 和模拟表盘模板,您将看到更好的方法。在最底部,他们设置了一个消息处理程序,它将以特定的时间间隔(在交互模式下)触发表盘的重绘。

/**
 * Handle updating the time periodically in interactive mode.
 */
private void handleUpdateTimeMessage() {
    invalidate();
    if (shouldTimerBeRunning()) {
        long timeMs = System.currentTimeMillis();
        long delayMs = INTERACTIVE_UPDATE_RATE_MS
                - (timeMs % INTERACTIVE_UPDATE_RATE_MS);
        mUpdateTimeHandler.sendEmptyMessageDelayed(MSG_UPDATE_TIME, delayMs);
    }
}

(它的部分比上面的片段更多,但一切都在示例表盘中。)

在此示例中,INTERACTIVE_UPDATE_RATE_MS 设置为秒。您只需将其设置为 200 毫秒,您的表盘将每秒更新五次。每次将画布旋转 1.2 度,您将获得所需的秒针运动。


推荐阅读