在Wear OS中如何在一秒钟内将秒表旋转五次?

时间:2018-10-30 22:55:10

标签: java wear-os android-wear-2.0 watch-face-api

我正在开发表盘表面,并希望将秒针的旋转角度在1/5秒内达到1.2度。

为什么要用这些数字?

1)360度/ 60秒=每秒6次降落

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

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

enter image description here

上面的图像花费一秒钟旋转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);
}

2 个答案:

答案 0 :(得分: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被设置为秒。您所要做的只是将其设置为200ms,并且表盘每秒将更新五次。每次将画布旋转1.2度,您将获得所需的秒针移动。

答案 1 :(得分:1)

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

您还应该去除多余的括号和不必要的强制转换。

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

f文字末尾的1000f使它成为浮点数,从而阻止了integer math truncation issues
这意味着millis被提升为float,所以除法的结果为float。
反过来会促使seconds浮动,所以加法的结果就是浮动。
反过来会促使6浮动,因此乘法的结果就是浮动。
这样就无需转换结果。