void ChangeView(int16_t hideView, int16_t showView, int16_t subView = -1);
/** 将指定 view 的 group 置于 ScrollView 最上层,避免被其他 group 遮挡(如对话界面按音量键时音量条被 RemindButton 盖住) */
void BringGroupToFront(int16_t viewId);
+ /** 刷新指定 view 的 group 和 ScrollView(用于同 view 切 subView 后下一帧再刷一次,解决偶现不刷新) */
+ void InvalidateGroupAndScroll(int16_t viewId);
int16_t GetPrevViewId() const { return prevView_; }
int16_t GetPrevSubViewId() const { return prevSubView_; }
ScrollView_->Add(group[viewId]);
}
+ void ThunderBirdMainView::InvalidateGroupAndScroll(int16_t viewId)
+ {
+ if (viewId < 0 || viewId >= MAXVIEW) {
+ return;
+ }
+ if (group[viewId] != nullptr) {
+ group[viewId]->Invalidate();
+ }
+ if (ScrollView_ != nullptr) {
+ ScrollView_->Invalidate();
+ }
+ }
+
bool ThunderBirdMainView::ChangeThunderBirdAdjustView(int16_t thisView) // 切换调整界面接口
{
if (group[thisView] == nullptr)
default:
break;
}
- group[hideView]->SetVisible(false);
+ // 同 view 仅切 subView 时不隐藏 group,避免偶现“组件不刷新”;只做子视图 Show 和 Invalidate
+ if (hideView != showView) {
+ group[hideView]->SetVisible(false);
+ }
}
// 同用遮罩,部分界面在内部自行开启,其余界面关闭
if(GetIsOpenScreenImageModel() == false)
}
currentView_ = showView; // 更新当前视图
currentSubView_ = subView; // 更新当前子视图
+ // 显式刷新当前 group,避免同 view 切 subView 时偶现组件不刷新(仅 ScrollView_ Invalidate 可能不触发子 group 重绘)
+ if (group[showView] != nullptr) {
+ group[showView]->Invalidate();
+ }
ScrollView_->Invalidate();
+ // 同 view 仅切 subView 时,下一帧再刷一次;息屏再亮屏会恢复说明是首帧绘制未触发,延迟一帧 Invalidate 可复现“亮屏重绘”效果
+ if (hideView == showView && subView != -1) {
+ int16_t capView = showView;
+ GraphicService::GetInstance()->PostGraphicEvent([capView]() {
+ ThunderBirdMainView* mv = ThunderBirdMainView::GetInstance();
+ if (mv != nullptr) {
+ mv->InvalidateGroupAndScroll(capView);
+ }
+ });
+ }
}
void ThunderBirdMainView::OpenBackGround(void)//打开遮罩
if(iconView->IsVisible() == false)
{
iconView->SetVisible(true);
+ iconView->Invalidate();
}
if(backGroundView->IsVisible() == false)
{