【问题标题】:How to rotate a second's hand watch five times in a second in Wear OS?如何在 Wear OS 中将秒针手表在一秒钟内旋转五次?
【发布时间】:2018-10-30 22:55:09
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我不确定现在从哪里调用您的 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);
        }
    }
    

    (它的部分比上面的 sn-p 还要多,但一切都在示例表盘中。)

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

    【讨论】:

      【解决方案2】:

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

      你还应该去掉过多的括号和不必要的演员表。

      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被提升为float,所以除法的结果是float。
      这反过来又促使seconds 浮动,所以加法的结果是浮动的。
      这反过来又促使6 浮动,所以乘法的结果是浮动的。
      这样就不需要转换结果了。

      【讨论】:

      • 谢谢@Andreas,但是,我如何应用每秒移动秒针五次的希望逻辑?
      • @PabloDarde 你是如何让它每秒移动一次的?您的问题是关于以更高的精度计算角度。如果您对更改现有代码(大概每秒运行一次 显示的代码 以每秒运行新代码 5 次)有疑问,则创建一个新问题来询问该问题,然后 显示你当前的代码每秒运行一次。
      • 基本上,我使用了上面的代码。我使用cavas.rotate(...)方法,并将第一个参数(度)设置为seconds * 6
      • @PabloDarde 这会将手旋转到正确的角度一次。要使手移动,您需要重新执行代码。您还没有展示您当前如何每秒重新执行代码,或每秒五次,或任何时候。如果您对如何做到这一点有疑问,请创建一个新问题并询问如何做到这一点(研究之后,因为应该已经有很多答案了)。 这个问题是关于更精确地计算角度的,并且已经回答了
      • 感谢您的回答。这个问题不是关于计算角度,我知道如何计算角度。我在我的问题中写下了所有的微积分。这是一个 Wear OS 问题。每次调用 onDraw 方法时都会调用旋转画布方法(大约 60 fps),但是,使用 canvas.rotate 方法我可以使用 Calendar.SECOND 参数覆盖这些 fps 调用。我不知道如何操纵Calendar.SECONDCalendar.MILLISECOND 以实现我的目标。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 2023-03-17
      • 2010-10-12
      相关资源
      最近更新 更多