鸿蒙原生开发手记:徒步迹 - 剪贴板与系统交互

鸿蒙原生开发手记:徒步迹 - 剪贴板与系统交互

使用系统剪贴板实现应用间数据交互


前言

剪贴板是应用间数据共享的基础工具。HarmonyOS 的 pasteboard 模块提供了系统剪贴板的读写能力,支持文本、图片、HTML 等多种数据类型。徒步迹利用剪贴板实现分享链接复制、路线数据导出等交互功能。


一、剪贴板基础

typescript 复制代码
import { pasteboard } from '@kit.BasicServicesKit';
import { image } from '@kit.ImageKit';
import { BusinessError } from '@kit.BasicServicesKit';

class ClipboardManager {
  // 复制文本
  static copyText(text: string): void {
    const data = pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, text);
    const systemPasteboard = pasteboard.getSystemPasteboard();
    systemPasteboard.setData(data);
    console.log('文本已复制到剪贴板');
  }

  // 读取文本
  static pasteText(): string {
    const systemPasteboard = pasteboard.getSystemPasteboard();
    const data = systemPasteboard.getData();
    if (data && data.mimeType === pasteboard.MIMETYPE_TEXT_PLAIN) {
      return data.data as string;
    }
    return '';
  }

  // 复制图片
  static async copyImage(pixelMap: image.PixelMap): Promise<void> {
    try {
      const data = pasteboard.createData(pasteboard.MIMETYPE_IMAGE_PNG, pixelMap);
      const systemPasteboard = pasteboard.getSystemPasteboard();
      await systemPasteboard.setDataAsync(data);
      console.log('图片已复制到剪贴板');
    } catch (e) {
      console.error('复制图片失败', (e as BusinessError).message);
    }
  }

  // 清空剪贴板
  static clear(): void {
    const systemPasteboard = pasteboard.getSystemPasteboard();
    systemPasteboard.clearData();
  }

  // 检查剪贴板内容类型
  static getContentType(): string {
    const systemPasteboard = pasteboard.getSystemPasteboard();
    const data = systemPasteboard.getData();
    return data ? data.mimeType : 'empty';
  }
}

二、分享链接复制

typescript 复制代码
@Component
struct ShareLinkSheet {
  @Prop routeLink: string = '';

  build() {
    Column() {
      Text('分享链接').fontSize(18).fontWeight(FontWeight.Bold)
        .width('100%').textAlign(TextAlign.Center).padding(16);

      // 链接预览
      Row() {
        Text(this.routeLink).fontSize(13).fontColor('#666')
          .layoutWeight(1).maxLines(1).textOverflow({ overflow: TextOverflow.Ellipsis });
        Button('复制').fontSize(13).fontColor('#4CAF50')
          .backgroundColor('#E8F5E9').borderRadius(12)
          .padding({ left: 12, right: 12 })
          .onClick(() => {
            ClipboardManager.copyText(this.routeLink);
          });
      }
      .width('100%').padding(16).backgroundColor('#F5F5F5').borderRadius(12);

      // 分享到
      Row() {
        this.ShareAction('微信', '#07C160');
        this.ShareAction('QQ', '#12B7F5');
        this.ShareAction('微博', '#FF6B35');
        this.ShareAction('系统', '#666');
      }
      .width('100%').padding(16).justifyContent(FlexAlign.SpaceAround);
    }
    .width('100%').backgroundColor(Color.White).borderRadius(16);
  }

  @Builder
  ShareAction(label: string, color: string) {
    Column() {
      Row() {
        Text(label).fontSize(12).fontColor(Color.White);
      }
      .width(48).height(48).backgroundColor(color).borderRadius(24)
      .justifyContent(FlexAlign.Center);
      Text(label).fontSize(12).fontColor('#666').margin({ top: 4 });
    }
    .alignItems(HorizontalAlign.Center);
  }
}

三、导出路线数据

typescript 复制代码
@Component
struct ExportRouteData {
  @Prop routeData: {
    name: string;
    distance: number;
    waypoints: Array<{ lat: number; lng: number }>;
  };

  build() {
    Column() {
      Text('导出路线数据').fontSize(18).fontWeight(FontWeight.Bold);
      Text('将路线数据导出为 GPX 格式,可在其他地图应用中使用')
        .fontSize(13).fontColor('#666').margin({ top: 8 });

      Button('导出 GPX 并复制')
        .width('100%').height(44).backgroundColor('#4CAF50')
        .fontColor(Color.White).borderRadius(22)
        .margin({ top: 16 })
        .onClick(() => this.exportAsGPX());
    }
    .padding(16).backgroundColor(Color.White).borderRadius(16);
  }

  exportAsGPX(): void {
    const gpx = this.generateGPX();
    ClipboardManager.copyText(gpx);
  }

  private generateGPX(): string {
    let gpx = `<?xml version="1.0" encoding="UTF-8"?>
<gpx version="1.1" creator="徒步迹">
  <trk>
    <name>${this.routeData.name}</name>
    <trkseg>`;

    for (const wp of this.routeData.waypoints) {
      gpx += `\n      <trkpt lat="${wp.lat}" lon="${wp.lng}"></trkpt>`;
    }

    gpx += `
    </trkseg>
  </trk>
</gpx>`;
    return gpx;
  }
}
数据类型 MIME 类型 复制方法 粘贴方法
纯文本 text/plain createData + setData getData
HTML text/html createHtmlData getData
图片 image/png createData + setDataAsync getDataAsync
自定义 custom/* 自定义序列化 自定义解析

四、总结

系统剪贴板是应用间数据共享的轻量级方案,适合文本、链接、简单数据的快速传递。徒步迹利用剪贴板实现了路线分享链接复制、GPX 数据导出等功能,提升了用户的数据流通体验。


总结

本文围绕"徒步迹"应用的实际开发场景,系统讲解了相关技术的实现要点。通过代码实战 +原理剖析的方式,帮助开发者快速掌握 HarmonyOS NEXT 的核心开发能力。

总结要点

  1. 理解 HarmonyOS NEXT 应用架构与 Ability 生命周期
  2. 掌握 ArkUI 声明式 UI 的状态管理与组件化开发
  3. 熟悉常用 Kit 能力(Map Kit、Location Kit、Camera Kit 等)的接入方式
  4. 学会性能优化、内存管理、并发编程等进阶技巧
  5. 具备从 0 到 1 构建完整 HarmonyOS 应用工程的能力

核心特性回顾

  • 声明式 UI:ArkUI 提供简洁高效的声明式开发范式
  • 状态管理:@State、@Prop、@Link、@Provide、@Consume 等装饰器
  • 跨组件通信:通过 Provide/Consume 实现跨层级数据传递
  • 原生能力:通过 Kit 接入系统能力(地图、定位、相机等)
  • 性能优化:LazyForEach、虚拟列表、Skeleton 骨架屏等

学习建议 :技术学习重在实践,建议结合项目源码同步动手操作,遇到问题多查阅HarmonyOS 官方文档


下一篇预告:鸿蒙原生开发手记:徒步迹 - 持续更新中


如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!

相关资源:

相关推荐
IT_陈寒5 分钟前
Redis缓存雪崩把我坑惨了,这次长记性了
前端·人工智能·后端
LucianaiB18 分钟前
用 WorkBuddy 研究腾讯、阿里和 DeepSeek,我没敢直接说「AI 很赚钱」
后端
用户83562907805137 分钟前
使用 Python 管理 PDF 属性和元数据
后端·python
分支预测失败1 小时前
RISC-V 上下文切换实战:从 Trap 入口到 Linux 进程调度
后端·嵌入式
用户8356290780511 小时前
使用 Python 在 Word 文档中创建自定义图表
后端·python
Profile排查笔记2 小时前
JavaScript 实现浏览器指纹生成:基础字段、Canvas 采样与 SHA-256 摘要
前端·人工智能·后端·自动化
GoGeekBaird2 小时前
我给 DeepSeek Harness 造了个铸造台
后端
YOU OU2 小时前
Spring Cloud概述
后端·spring·spring cloud
半个落月2 小时前
React JWT 登录鉴权实战:Mock、Zustand、Axios 与路由守卫全流程
后端·react.js
XingXingXxx2 小时前
Skill 能自己变强吗?从轨迹归纳到文本空间优化的进化之路
后端