環境
GUI Guider: 1.10.1
LVGL: 8.3
ウィジェット: ボタン
スタイルパーツ: LV_PART_MAIN
スタイル状態: LV_STATE_DEFAULT
問題の説明
GUI Guider 1.10.1 で再現可能なコード生成の問題を発見しました。
ボタンに背景色が設定されているにもかかわらず、背景の不透明度が0に設定されている場合、GUI Guiderは対応する背景色プロパティを生成しません。
実行時に背景の透明度を動的に変更すると、予期しない動作が発生します。
再生
ボタンを作成して設定します。
背景色:#F08300
背景の不透明度: 0
次に、LVGL 8.3コードを生成します。
GUI Guider が生成するもの:
lv_obj_set_style_bg_opa(ui->screen_password_btn_15,
0、
LV_PART_MAIN | LV_STATE_DEFAULT);
しかし、設定した背景色は生成されません。
lv_obj_set_style_bg_color(ui->screen_password_btn_15,
lv_color_hex(0xF08300)
LV_PART_MAIN | LV_STATE_DEFAULT);
テスト:背景の不透明度のみを0から1に変更する
背景色の#F08300はそのままに、背景の不透明度だけを0から1に変更しました。
コードを再生成した後、GUI Guiderは以下を生成します。
lv_obj_set_style_bg_opa(ui->screen_password_btn_15,
1、
LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(ui->screen_password_btn_15,
lv_color_hex(0xF08300)
LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_grad_dir(ui->screen_password_btn_15,
LV_GRAD_DIR_NONE、
LV_PART_MAIN | LV_STATE_DEFAULT);
したがって、生成されるコードは、背景の不透明度が正確に0であるかどうかによって異なります。
背景の不透明度 = 0:
bg_opaが生成されます
bg_color は生成されません
背景の不透明度 = 1:
bg_opaが生成されます
bg_color が生成されます
その他の背景プロパティも生成されます
実行時への影響
私のアプリケーションは背景の不透明度を使って現在選択されているパスワード番号を示します。
背景色はGUI Guiderで #F08300 として設定され、アプリケーションは背景の不透明度のみを動的に変更します。
例:
lv_obj_set_style_bg_opa(btn,
LV_OPA_COVER、
LV_PART_MAIN | LV_STATE_DEFAULT);
初期の背景不透明度が0のボタンの場合、生成されるコードには設定された背景色が含まれません。
アプリケーションが不透明度を0からLV_OPA_COVERに変更すると、ボタンはGUI Guiderで設定された #F08300 色の代わりにLVGLテーマまたはデフォルトの背景色を表示します。
その動作は以下のとおりです。
GUI Guiderの設定:
背景色 = #F08300
背景の不透明度 = 0
生成されたコード:
bg_opa = 0
bg_color は生成されません
ランタイム:
bg_opa が LV_OPA_COVER に変更されました
結果:
#F08300の代わりに、デフォルトまたはテーマの背景色が表示されます。
応急措置
アプリケーションコード内で背景色を明示的に設定すると、以下の問題が解決します。
lv_obj_set_style_bg_color(btn,
lv_color_hex(0xF08300)
LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(btn,
LV_OPA_COVER、
LV_PART_MAIN | LV_STATE_DEFAULT);
別の回避策としては、GUI Guiderで背景の不透明度を1に設定する方法があります。これにより、GUI Guiderは設定された背景色を生成するようになります。
しかし、これは初期のUI状態を変更してしまうため、理想的とは言えません。
期待される動作
背景色と背景の不透明度は、それぞれ独立したLVGLスタイルプロパティです。
ユーザーが明示的に以下を設定する場合:
背景色 = #F08300
背景の不透明度 = 0
GUI Guiderは、生成されたコードにおいて両方のプロパティを保持するはずです。
lv_obj_set_style_bg_opa(btn,
0、
LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(btn,
lv_color_hex(0xF08300)、
LV_PART_MAIN |LV_STATE_DEFAULT);
bg_color bg_opa が0のときは目に見える影響はありませんが、アプリケーションが実行時に動的にbg_opaが変化すると重要になります。
現在のコード生成動作では、GUI Guiderで設定された背景色情報が失われます。
実際の行動
GUI Guider 1.10.1 では、背景の不透明度が 0 の場合、背景スタイルのプロパティが省略されるようです。
不透明度を0から1に変更するだけで、背景色やその他の背景プロパティが再生成されます。
再現手順
GUI Guider 1.10.1 でボタンを作成する。
背景色を#F08300に設定してください。
背景の不透明度を0に設定してください。
LVGL 8.3コードを生成します。
値0のlv_obj_set_style_bg_opaが生成されていることを確認してください。
#F08300 を指定した lv_obj_set_style_bg_color は生成されないことに注意してください。
背景の不透明度のみを0から1に変更してください。
コードを再度生成してください。
#F08300 を指定した lv_obj_set_style_bg_color が生成されていることを確認してください。
実行時に、元のボタンの不透明度をLV_OPA_COVERに変更します。
設定された背景色は、アプリケーションが明示的に設定しない限り表示bg_colorないことに注意してください。
質問
これはGUI Guider 1.10.1における意図的なコードサイズ最適化なのでしょうか、それともコード生成の問題なのでしょうか?
もしこの最適化が意図的であれば、GUI Guiderはバックグラウンド不透明度が0のときにバックグラウンドプロパティを保持するオプションを提供してくれますか?
ランタイムアプリケーションはLVGLスタイルのプロパティを動的に変更することが多いため、初期の不透明性だけでbg_colorを省略すると、UI設定とは異なる実行時の挙動が生じる可能性があります。
こんにちは、 @zzjgood さん、
投稿ありがとうございます。
あなたが説明した行動を再現できます。これはコード生成の問題だと思います。ユーザーが背景色を明示的に設定する場合、GUI Guiderは初期の背景不透明度が0でも対応するbg_colorコードを保持するか、透明オブジェクトの背景スタイルプロパティを保持するオプションを提供するべきです。この件はGUI-Guiderチームに報告し、修正を依頼します。さらに、当社の内部エスカレーションプロセスに基づき、以下の情報を提供していただけるとありがたいです。
- どのNXP製品を使っていますか?
- 最終的なアプリケーションは?
現在の実用的な回避策は、アプリケーションコード内で背景色と不透明度の両方を明示的に設定することです。
lv_obj_set_style_bg_color(btn,
lv_color_hex(0xF08300),
LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_set_style_bg_opa(btn,
LV_OPA_COVER,
LV_PART_MAIN | LV_STATE_DEFAULT);
お役に立てば幸いです。
BR
セレステ