文档开发者中心
我的
|

App开发

如何动态更换主题颜色?

如题,有没有例子参考

点赞
收藏
1
回复
4
分享
举报
浏览280 发布于2024-11-06 13:22未知归属地
全部评论
最多点赞
最新发布
最早发布
|
技术支持

【解决方案】
使用ArkUI主题资源+状态变量,可以实现主题自由切换。具体方案如下:

  1. 定义主题资源resources/base/element/color.json:

    收起
    自动换行
    深色代码主题
    复制
    {
      "color": [
        {
          "name": "start_window_background",
          "value": "#FFFFFF"
        },
        {
          "name": "primary_text",
          "value": "#FF000000"
        },
        {
          "name": "dark_primary_text",
          "value": "#FFFFFFFF"
        },
        {
          "name": "dark_primary_bg",
          "value": "#FF222222"
        },
        {
          "name": "primary_bg",
          "value": "#FFFFFFFF"
        }
      ]
    }
    
  2. 编写UI组件页面,验证页面主题切换:

    收起
    自动换行
    深色代码主题
    复制
    import { ThemeManager } from './ThemeManager';
    
    const KEY_IS_DARK: string = "isDarkTheme";
    
    @Entry
    @Component
    struct Index {
      // 绑定全局主题状态
      @StorageLink(KEY_IS_DARK) isDark: boolean = false;
    
      build() {
        Column() {
          // 示例1:文本动态颜色
          Text("主要内容")
            .fontColor(this.isDark ? $r("app.color.dark_primary_text") : $r("app.color.primary_text"))
            .fontSize(20)
          // 示例2:按钮切换主题
          Button(this.isDark ? "切换浅色" : "切换深色")
            .onClick(() => ThemeManager.toggleTheme())
        }
        .width('100%')
        .height('100%')
        .backgroundColor(this.isDark ? $r("app.color.dark_primary_bg") : $r("app.color.primary_bg"))
      }
    }
  3. 定义主题管理工具类,实现主题切换功能:

    收起
    自动换行
    深色代码主题
    复制
    const KEY_IS_DARK: string = "isDarkTheme";
    
    export class ThemeManager {
      // 初始化默认主题
      static init() {
        if (!AppStorage.has(KEY_IS_DARK)) {
          AppStorage.setOrCreate(KEY_IS_DARK, false);
        }
      }
    
      // 切换主题
      static toggleTheme() {
        AppStorage.set(KEY_IS_DARK, !AppStorage.get(KEY_IS_DARK));
      }
    
      // 获取当前主题
      static get isDark(): boolean {
        return AppStorage.get(KEY_IS_DARK) || false;
      }
    }
    
    ThemeManager.init();
  4. 主题深浅模式切换效果如下:

    浅色:

    cke_6823.png

    深色:

    cke_18424.png

展开全部
3楼回复于2025-09-11 09:13 来自广东
有DEMO了吗
1
2楼回复于2024-11-09 01:35 来自湖南
  • 小小唐葫芦
    已回复
    2024-12-03 09:58 来自广东

主题换肤参考这个:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-arkui-theme-V5#themecontrol

Demo如下:

收起
自动换行
深色代码主题
复制
import { CustomTheme, CustomColors, ThemeControl } from '@kit.ArkUI';
// 自定义主题颜色
class BlueColors implements CustomColors {
  fontPrimary = Color.Red;
  backgroundPrimary = Color.Red;
  brand = Color.Blue; //品牌色
}

class PageCustomTheme implements CustomTheme {
  colors?: CustomColors;

  constructor(colors: CustomColors) {
    this.colors = colors;
  }
}
// 创建实例
const BlueColorsTheme = new PageCustomTheme(new BlueColors());

@Entry
@Preview
@Component
struct ExampleComponent {
  @State counter: number = 0;
  @State userName: string = "HongMeng";

  build() {
    Column() {

      Text(`Counter: ${this.counter}`)
        .fontSize(24)
        .margin(10);

      Button("Change")
        .onClick(() => {
          this.counter += 1;
          // 在页面build之前执行ThemeControl.setDefaultTheme,设置App默认样式风格为BlueColorsTheme。
          ThemeControl.setDefaultTheme(BlueColorsTheme);
        })
        .margin(10);
    }
  }
}
展开全部
1楼编辑于2024-12-03 09:58 来自广东
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要提问题

了解社区公约,与您携手共创和谐专业的开发者社区。