如何在 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 度,您将获得所需的秒针运动。
我正在开发一个表盘,想在 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 度,您将获得所需的秒针运动。