[英]Updating Android Wear watchface BEFORE display turns on
我制作的表盘可以正常工作,可以加载到手机上,选择并在我的MOTO 360上运行,但问题是屏幕关闭且我触摸屏幕时亮了,但是手(位图)在正确的时间摆动。 看起来当屏幕关闭时,它不再更新。 我正在使用一个计时器例程,如果isVisible()和!isInAmbientMode在交互时从30毫秒起触发一次invalidate(),则该计时器例程仅更改为1秒更新。
注意:我尝试在所有这些例程中添加invalidate(),但没有帮助。
以下是相关代码:
// handler to update the time once a second in interactive mode
final Handler mUpdateTimeHandler = new Handler() {
@Override
public void handleMessage(Message message) {
switch (message.what) {
case MSG_UPDATE_TIME:
invalidate();
long timeMs = System.currentTimeMillis();
if (shouldTimerBeRunning()) {
long delayMs = INTERACTIVE_UPDATE_RATE_MS
- (timeMs % INTERACTIVE_UPDATE_RATE_MS);
mUpdateTimeHandler
.sendEmptyMessageDelayed(MSG_UPDATE_TIME, delayMs);
} else {
long delayMs = NON_INTERACTIVE_UPDATE_RATE_MS
- (timeMs % NON_INTERACTIVE_UPDATE_RATE_MS);
mUpdateTimeHandler
.sendEmptyMessageDelayed(MSG_UPDATE_TIME, delayMs);
}
break;
}
}
};
@Override
public void onAmbientModeChanged(boolean inAmbientMode) {
super.onAmbientModeChanged(inAmbientMode);
if (bLowBitAmbient) {
boolean antiAlias = !inAmbientMode;
mHrPaint.setAntiAlias(antiAlias);
mMinPaint.setAntiAlias(antiAlias);
mSecPaint.setAntiAlias(antiAlias);
mCapPaint.setAntiAlias(antiAlias);
mTextPaint.setAntiAlias(antiAlias);
mTickPaint.setAntiAlias(antiAlias);
}
updateTimer();
}
// Request to update Timer (only if visible and interactive)
private void updateTimer() {
mUpdateTimeHandler.removeMessages(MSG_UPDATE_TIME);
if (shouldTimerBeRunning()) {
mUpdateTimeHandler.sendEmptyMessage(MSG_UPDATE_TIME);
}
}
// Timer only runs when visible and interactive.
private boolean shouldTimerBeRunning() {
return isVisible() && !isInAmbientMode();
}
我已经找到解决方法,因此不必使用警报。 我重写onVisiblityChanged并放置一个布尔标志。 在onDraw中,我只是将画布涂成黑色。 这样,当设备唤醒时,屏幕将一直显示黑色,直到下一轮onDraw为止。 看起来工作不错!
@Override
public void onVisibilityChanged(boolean visible) {
super.onVisibilityChanged(visible);
// the watch face became visible or invisible
bDisplayBitmap = visible;
...
invalidate();
}
@Override
public void onDraw(Canvas canvas, Rect bounds) {
// Draw watch face
...
if(bDisplayBitmap) {
canvas.drawBitmap(mBackgroundBitmap, 0, 0, null);
} else {
canvas.drawPaint(mBackgroundPaint);
}
...
}
当启用环境模式时,系统会尝试尽可能多地节省电池电量并使设备进入深度睡眠状态,在此期间,处理程序将不会运行。 在大多数情况下,对于表盘,您无需在深度睡眠时每分钟更新一次,因此您可以使用WatchFaceService.Engine.onTimeTick()在该状态下每分钟通知一次(或时区更改或日期更改等),请参阅文档以获取详细信息。 不建议任何更频繁的事情,但是可以使用AlarmManager来实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.