Как повернуть секундные стрелки пять раз в секунду в Wear OS? - PullRequest
0 голосов
/ 31 октября 2018

Я разрабатываю циферблат и хочу повернуть секундную стрелку на 1,2 градуса за 1/5 секунды.

Почему эти цифры?

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 голосов
/ 01 ноября 2018

Я не уверен, откуда сейчас вызывается ваш метод 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 градуса каждый раз, и вы получите желаемое движение секундной стрелки.

0 голосов
/ 31 октября 2018

Вы должны включить миллисекунду в расчет.

Вам также следует избавиться от лишних скобок и ненужных приведений.

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

f в конце литерала 1000f делает его плавающим, предотвращая целочисленные математические проблемы усечения .
Это означает, что millis повышается до float, поэтому результатом деления является float.
Это, в свою очередь, способствует seconds для плавания, поэтому результатом сложения является float.
Это, в свою очередь, способствует 6 с плавающей точкой, поэтому результатом умножения является float.
Тогда нет необходимости разыгрывать результат.

...