1

我正在开发一个表盘,想在 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);
}
4

2 回答 2

2

我不确定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 度,您将获得所需的秒针运动。

于 2018-11-01T19:13:31.427 回答
1

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

您还应该摆脱过多的括号和不必要的演员表。

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

f文字末尾的使其1000f成为浮点数,防止整数数学截断问题
那意味着millis被提升为浮点数,所以除法的结果是浮点数。
这反过来促进seconds浮动,所以加法的结果是浮动。
这反过来促进6浮动,所以乘法的结果是浮动的。
然后不需要转换结果。

于 2018-10-30T23:18:25.177 回答