当前位置: 首页 > news >正文

[鸿蒙2025领航者闯关]图标资源统一管理

解决方案

  1. 系统图标使用
    @Component
    struct SystemIcons {
    build() {
    Row({ space: 16 }) {
    // ✅ 使用系统图标
    Image(r ( ′ s y s . m e d i a . o h o s i c p u b l i c a d d ′ ) ) . w i d t h ( 24 ) . h e i g h t ( 24 ) . f i l l C o l o r ( C o l o r . B l a c k ) ; I m a g e ( r('sys.media.ohos_ic_public_add')) .width(24) .height(24) .fillColor(Color.Black); Image(r(sys.media.ohosicpublicadd)).width(24).height(24).fillColor(Color.Black);Image(r(‘sys.media.ohos_ic_public_delete’))
    .width(24)
    .height(24)
    .fillColor(Color.Red);

    Image($r(‘sys.media.ohos_ic_public_search’))
    .width(24)
    .height(24);
    }
    }
    }
  2. 自定义图标管理
    /**
  • 图标资源管理类
    */
    export class AppIcons {
    // ✅ 统一管理图标资源
    static readonly ADD = $r(‘app.media.ic_add’);
    static readonly DELETE = $r(‘app.media.ic_delete’);
    static readonly EDIT = $r(‘app.media.ic_edit’);
    static readonly SEARCH = $r(‘app.media.ic_search’);
    static readonly FILTER = $r(‘app.media.ic_filter’);
    static readonly SETTINGS = $r(‘app.media.ic_settings’);

    // 功能模块图标
    static readonly ITEM = $r(‘app.media.ic_item’);
    static readonly HEALTH = $r(‘app.media.ic_health’);
    static readonly BABY = $r(‘app.media.ic_baby’);
    static readonly ASSET = $r(‘app.media.ic_asset’);
    static readonly FINANCE = $r(‘app.media.ic_finance’);

    // 状态图标
    static readonly SUCCESS = $r(‘app.media.ic_success’);
    static readonly WARNING = $r(‘app.media.ic_warning’);
    static readonly ERROR = $r(‘app.media.ic_error’);
    static readonly INFO = $r(‘app.media.ic_info’);
    }

    // ✅ 使用
    @Component
    struct IconUsage {
    build() {
    Row() {
    Image(AppIcons.ADD)
    .width(24)
    .height(24);

    Image(AppIcons.DELETE)
    .width(24)
    .height(24)
    .fillColor(Color.Red);
    }
    }
    }
  1. 可复用图标组件
    /**
  • 图标组件
    */
    @Component
    export struct AppIcon {
    @Prop icon: Resource;
    @Prop size: number = 24;
    @Prop color?: ResourceColor;

    build() {
    Image(this.icon)
    .width(this.size)
    .height(this.size)
    .fillColor(this.color)
    .objectFit(ImageFit.Contain);
    }
    }

    // ✅ 使用
    @Component
    struct IconDemo {
    build() {
    Row({ space: 16 }) {
    AppIcon({
    icon: AppIcons.ADD,
    size: 24,
    color: AppColors.PRIMARY
    })

    AppIcon({
    icon: AppIcons.DELETE,
    size: 32,
    color: Color.Red
    })
    }
    }
    }
  1. 带标签的图标按钮
    /**
  • 图标按钮组件
    */
    @Component
    export struct IconButton {
    @Prop icon: Resource;
    @Prop label: string;
    @Prop onClick?: () => void;
    @Prop iconSize: number = 24;
    @Prop iconColor?: ResourceColor;

    build() {
    Column({ space: 4 }) {
    Image(this.icon)
    .width(this.iconSize)
    .height(this.iconSize)
    .fillColor(this.iconColor);

    Text(this.label)
    .fontSize(12)
    .fontColor(‘#666666’);
    }
    .padding(8)
    .borderRadius(8)
    .onClick(() => {
    if (this.onClick) {
    this.onClick();
    }
    })
    }
    }

    // ✅ 使用
    @Component
    struct ActionBar {
    build() {
    Row({ space: 24 }) {
    IconButton({
    icon: AppIcons.ADD,
    label: ‘添加’,
    iconColor: AppColors.PRIMARY,
    onClick: () => {
    console.info(‘点击添加’);
    }
    })

    IconButton({
    icon: AppIcons.EDIT,
    label: ‘编辑’,
    onClick: () => {
    console.info(‘点击编辑’);
    }
    })
    }
    }
    }
  1. 动态图标状态
    /**
  • 可切换状态的图标
    /
    @Component
    struct ToggleIcon {
    @State isActive: boolean = false;

    build() {
    Image(this.isActive ? AppIcons.HEART_FILLED : AppIcons.HEART_OUTLINE)
    .width(24)
    .height(24)
    .fillColor(this.isActive ? Color.Red : ‘#999999’)
    .onClick(() => {
    animateTo({ duration: 200 }, () => {
    this.isActive = !this.isActive;
    });
    })
    }
    }

    /
    *
  • 加载状态图标
    */
    @Component
    struct LoadingIcon {
    @State isLoading: boolean = true;

    build() {
    if (this.isLoading) {
    LoadingProgress()
    .width(24)
    .height(24)
    .color(AppColors.PRIMARY);
    } else {
    Image(AppIcons.SUCCESS)
    .width(24)
    .height(24)
    .fillColor(Color.Green);
    }
    }
    }
  1. 图标大小规范
    /**
  • 图标尺寸常量
    */
    export class IconSizes {
    static readonly SMALL = 16; // 小图标
    static readonly NORMAL = 24; // 常规图标
    static readonly LARGE = 32; // 大图标
    static readonly XLARGE = 48; // 超大图标
    }

    // ✅ 使用
    Image(AppIcons.ADD)
    .width(IconSizes.NORMAL)
    .height(IconSizes.NORMAL);
    图标格式选择
    SVG vs PNG
    特性 SVG PNG
    缩放 ✅ 无损 ❌ 失真
    颜色控制 ✅ fillColor ❌ 不可改
    文件大小 小 大
    适用场景 单色图标 复杂图片
    推荐方案
    // ✅ 推荐:单色图标用SVG
    resources/base/media/
    ic_add.svg // 添加图标
    ic_delete.svg // 删除图标
    ic_edit.svg // 编辑图标

    // ✅ 推荐:复杂图片用PNG
    resources/base/media/
    bg_splash.png // 启动页背景
    img_avatar.png // 用户头像
    img_banner.png // Banner图片
    实战案例
    案例1: 底部导航栏
    @Component
    struct TabBar {
    @State currentIndex: number = 0;

    private tabs: TabInfo[] = [
    { id: 0, icon: AppIcons.HOME, label: ‘首页’ },
    { id: 1, icon: AppIcons.CATEGORY, label: ‘分类’ },
    { id: 2, icon: AppIcons.PROFILE, label: ‘我的’ }
    ];

    @Builder
    buildTab(tab: TabInfo, index: number) {
    Column({ space: 4 }) {
    Image(tab.icon)
    .width(24)
    .height(24)
    .fillColor(this.currentIndex === index ? AppColors.PRIMARY : ‘#999999’);

    Text(tab.label)
    .fontSize(12)
    .fontColor(this.currentIndex === index ? AppColors.PRIMARY : ‘#999999’);
    }
    }

    build() {
    Row() {
    ForEach(this.tabs, (tab: TabInfo, index: number) => {
    this.buildTab(tab, index)
    .layoutWeight(1)
    .onClick(() => {
    this.currentIndex = index;
    })
    })
    }
    .width(‘100%’)
    .height(56)
    .backgroundColor(Color.White)
    }
    }
    案例2: 空状态页面
    @Component
    struct EmptyState {
    @Prop icon: Resource = AppIcons.EMPTY;
    @Prop message: string = ‘暂无数据’;
    @Prop actionText?: string;
    @Prop onAction?: () => void;

    build() {
    Column({ space: 16 }) {
    Image(this.icon)
    .width(120)
    .height(120)
    .fillColor(‘#CCCCCC’);

    Text(this.message)
    .fontSize(14)
    .fontColor(‘#999999’);

    if (this.actionText && this.onAction) {
    Button(this.actionText)
    .onClick(() => {
    if (this.onAction) {
    this.onAction();
    }
    });
    }
    }
    .width(‘100%’)
    .height(‘100%’)
    .justifyContent(FlexAlign.Center);
    }
    }

    // 使用
    EmptyState({
    icon: AppIcons.NO_DATA,
    message: ‘还没有添加物品’,
    actionText: ‘立即添加’,
    onAction: () => {
    router.pushUrl({ url: ‘pages/AddItemPage’ });
    }
    })
    最佳实践
  1. 图标命名规范
    // ✅ 推荐命名
    ic_add.svg // ic_功能.svg
    ic_delete.svg
    ic_home_filled.svg // ic_功能_状态.svg
    ic_heart_outline.svg

    // ❌ 不推荐
    add.svg
    delete_icon.svg
    home.png
  2. 统一管理
    // ✅ 推荐:集中管理
    export class AppIcons {
    static readonly ADD =KaTeX parse error: Expected 'EOF', got '}' at position 24: …edia.ic_add'); }̲ ​ // ❌ 不推荐:分散使…r(‘app.media.ic_add’)); // 到处硬编码
  3. 响应式尺寸
    // ✅ 推荐:使用vp单位
    .width(24) // vp,自动适配屏幕密度

    // ❌ 不推荐:使用px
    .width(‘24px’) // 不同屏幕显示大小不一致
    总结
    图标管理要点:

✅ AppIcons统一管理资源 ✅ 单色图标用SVG+fillColor ✅ 封装AppIcon组件复用 ✅ 遵循命名规范 ✅ 使用vp单位响应式

规范的图标管理提升开发效率!

http://www.cnnetsun.cn/news/119398.html

相关文章:

  • 区分__proto__和prototype
  • 西门子PLC地址知识点
  • EmotiVoice开源项目依赖项管理最佳实践
  • 如何彻底解决腾讯游戏卡顿问题:sguard_limit资源限制器完整指南
  • MiniGPT-4终极优化指南:5个简单技巧实现3倍推理加速
  • 鼠标性能测试终极指南:从新手到专家的完整解决方案
  • 终极指南:如何用pbxproj轻松玩转Xcode项目文件
  • 移动端AI部署革命:Paddle-Lite如何让深度学习模型在手机上流畅运行
  • 类型安全强化学习实战:从Gymnasium类型提示到项目稳健性提升
  • OBS直播教程:OBS多路推流插件如何下载?如何安装?怎么用?
  • ComfyUI-Manager依赖安装:5分钟搞定pip与uv的完美切换
  • 5步精通libgit2跨平台编译:从依赖管理到性能优化
  • DiT架构演进:从理论突破到工业级扩展的技术实践
  • EmotiVoice只服务于现实世界的积极连接
  • 20、嵌入式处理器基于软件的自测试技术解析
  • 终极JavaScript代码质量检测工具:5分钟快速提升开发效率
  • Nobel A001A140传感器
  • IEC 60950-1安全标准完整指南:从理论到实践的全面解析
  • AzerothCore-WoTLK容器化部署完全指南:从零构建企业级MMO服务器
  • 5分钟掌握鼠标性能测试:MouseTester完全使用手册
  • 5步构建可靠消息系统:Watermill框架实战指南
  • 7天攻克图像标注难题:Labelme与ResNet的高效组合方案
  • Memobase完整安装指南:5步快速搭建AI长期记忆系统
  • 终极Mac性能监控指南:MenuMeters让你的系统状态一目了然
  • RQ分布式任务监控实战指南:5分钟搭建高效日志追踪系统
  • 突破70%构建瓶颈:Bazel企业级多语言项目效能诊断与优化
  • 百度网盘提取码智能获取完整指南:告别繁琐查询的终极方案
  • 如何快速掌握大语言模型部署:FastChat完整实践指南
  • 【Leetcode】997. Find the Town Judge
  • 百度网盘提取码智能获取终极指南