外观设置 Cordova 与 OpenHarmony 混合开发实战

📌 模块概述

外观设置功能允许用户自定义应用的外观,包括主题色、字体、背景等。用户可以根据自己的喜好来定制应用的外观。

🔗 完整流程

第一步:选择主题

用户选择喜欢的主题。

第二步:应用主题

主题被应用到整个应用。

第三步:保存偏好

用户的主题选择被保存。

🔧 Web代码实现

javascript 复制代码
async renderAppearance() {
  const settings = await noteDB.getSettings();

  return `
    <div class="page active">
      <div class="page-header">
        <h1 class="page-title">🎨 外观设置</h1>
      </div>
      <div class="appearance-settings">
        <div class="form-group">
          <label>主题</label>
          <div class="theme-options">
            <button class="theme-btn ${settings.theme === 'light' ? 'active' : ''}" onclick="app.setTheme('light')">浅色</button>
            <button class="theme-btn ${settings.theme === 'dark' ? 'active' : ''}" onclick="app.setTheme('dark')">深色</button>
          </div>
        </div>
        <div class="form-group">
          <label>主色</label>
          <input type="color" id="primary-color" value="${settings.primaryColor || '#409EFF'}" onchange="app.setPrimaryColor(this.value)">
        </div>
      </div>
    </div>
  `;
}

// 设置主题
async setTheme(theme) {
  try {
    const settings = await noteDB.getSettings();
    settings.theme = theme;
    await noteDB.updateSettings(settings);
    
    // 应用主题
    document.documentElement.setAttribute('data-theme', theme);
    
    Utils.showToast('主题已更改', 'success');
  } catch (error) {
    console.error('设置主题失败:', error);
  }
}

// 设置主色
async setPrimaryColor(color) {
  try {
    const settings = await noteDB.getSettings();
    settings.primaryColor = color;
    await noteDB.updateSettings(settings);
    
    // 应用颜色
    document.documentElement.style.setProperty('--primary-color', color);
    
    Utils.showToast('颜色已更改', 'success');
  } catch (error) {
    console.error('设置颜色失败:', error);
  }
}

🔌 OpenHarmony 原生代码

typescript 复制代码
// AppearancePlugin.ets - 外观设置插件
import { webview } from '@kit.ArkWeb';
import { common } from '@kit.AbilityKit';
import { fileIo } from '@kit.CoreFileKit';

@NativeComponent
export class AppearancePlugin {
  private context: common.UIAbilityContext;

  constructor(context: common.UIAbilityContext) {
    this.context = context;
  }

  // 初始化插件
  public init(webviewController: webview.WebviewController): void {
    webviewController.registerJavaScriptProxy(
      new AppearanceJSProxy(this),
      'appearancePlugin',
      ['setTheme', 'setPrimaryColor']
    );
  }

  // 设置主题
  public setTheme(theme: string): Promise<boolean> {
    return new Promise((resolve) => {
      try {
        const settingsPath = this.context.cacheDir + '/settings.json';
        let settings: any = { theme: 'light' };
        
        try {
          const content = fileIo.readTextSync(settingsPath);
          settings = JSON.parse(content);
        } catch {}
        
        settings.theme = theme;
        fileIo.writeTextSync(settingsPath, JSON.stringify(settings, null, 2));
        resolve(true);
      } catch (error) {
        console.error('Failed to set theme:', error);
        resolve(false);
      }
    });
  }

  // 设置主色
  public setPrimaryColor(color: string): Promise<boolean> {
    return new Promise((resolve) => {
      try {
        const settingsPath = this.context.cacheDir + '/settings.json';
        let settings: any = { primaryColor: '#409EFF' };
        
        try {
          const content = fileIo.readTextSync(settingsPath);
          settings = JSON.parse(content);
        } catch {}
        
        settings.primaryColor = color;
        fileIo.writeTextSync(settingsPath, JSON.stringify(settings, null, 2));
        resolve(true);
      } catch (error) {
        console.error('Failed to set primary color:', error);
        resolve(false);
      }
    });
  }
}

// AppearanceJSProxy.ets - JavaScript代理类
class AppearanceJSProxy {
  private plugin: AppearancePlugin;

  constructor(plugin: AppearancePlugin) {
    this.plugin = plugin;
  }

  setTheme(theme: string): void {
    this.plugin.setTheme(theme).then(success => {
      console.log('Theme set:', success);
    });
  }

  setPrimaryColor(color: string): void {
    this.plugin.setPrimaryColor(color).then(success => {
      console.log('Primary color set:', success);
    });
  }
}

📝 总结

外观设置功能展示了如何在Cordova与OpenHarmony混合开发中实现主题和颜色定制。

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

相关推荐
程序员:钧念5 小时前
深度学习与强化学习的区别
人工智能·python·深度学习·算法·transformer·rag
数据与后端架构提升之路6 小时前
TeleTron 源码揭秘:如何用适配器模式“无缝魔改” Megatron-Core?
人工智能·python·适配器模式
hele_two7 小时前
快速幂算法
c++·python·算法
l1t7 小时前
利用DeepSeek将python DLX求解数独程序格式化并改成3.x版本
开发语言·python·算法·数独
Cemtery1169 小时前
Day26 常见的降维算法
人工智能·python·算法·机器学习
星空椰10 小时前
快速掌握FastAPI:高效构建Web API
python·fastapi
塔尖尖儿10 小时前
Python中range()到底是什么演示
python
Ethan-D11 小时前
#每日一题19 回溯 + 全排列思想
java·开发语言·python·算法·leetcode
weixin_4469340312 小时前
统计学中“in sample test”与“out of sample”有何区别?
人工智能·python·深度学习·机器学习·计算机视觉