我正在开发表盘表面,并希望将秒针的旋转角度在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);
}
答案 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
浮动,因此乘法的结果就是浮动。
这样就无需转换结果。