如何在 Wear OS 中让秒针在一秒内转动五圈?

How to rotate a second's hand watch five times in a second in 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);
}

您需要在计算中包括毫秒。

您还应该去掉过多的括号和不必要的转换。

final int seconds = mCalendar.get(Calendar.SECOND);
final int millis = mCalendar.get(Calendar.MILLISECOND);
final float secondsRotation = (seconds + millis / 1000f) * 6;

1000f 文字末尾的 f 使其成为浮点数,防止 integer math truncation issues.
这意味着 millis 被提升为浮点数,所以除法的结果是浮点数。
这反过来又促使 seconds 浮动,所以加法的结果是浮动的。
这反过来又促使 6 浮点数,所以乘法的结果是浮点数。
然后就不需要转换结果了。

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

如果您在 Android Studio 中创建新项目并 select 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 毫秒,您的表盘将每秒更新五次。每次旋转 canvas 1.2 度,您将获得所需的秒针运动。