外观设置 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

相关推荐
ValhallaCoder9 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
猫头虎10 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
八零后琐话11 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
青春不朽51212 小时前
Scrapy框架入门指南
python·scrapy
MZ_ZXD00112 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
全栈老石13 小时前
Python 异步生存手册:给被 JS async/await 宠坏的全栈工程师
后端·python
梨落秋霜13 小时前
Python入门篇【模块/包】
python
阔皮大师14 小时前
INote轻量文本编辑器
java·javascript·python·c#
小法师爱分享14 小时前
StickyNotes,简单便签超实用
java·python