首页 > 其他分享 >HarmonyOS开发之RichEditor组件实现评论编辑功能

HarmonyOS开发之RichEditor组件实现评论编辑功能

时间:2024-09-19 14:53:49浏览次数:16  
标签:img Color media app HarmonyOS controller onClick RichEditor 组件

随着社交媒体和即时通讯应用的普及,用户对于内容创作的需求日益增长,特别是对于评论、回复等互动形式。为了满足这一需求,HarmonyOS NEXT提供了强大的RichEditor组件,支持图文混排和文本交互式编辑,使得开发者可以轻松构建功能丰富的编辑界面。本文将通过几个具体场景,详细介绍如何利用RichEditor实现评论编辑功能。

场景一:基于文字图片以及@信息的好友评论

实现思路

  1. 添加文字和图片:使用addTextSpanaddImageSpan方法分别添加文字和图片。
  2. 实现@功能:通过addBuilderSpan方法创建一段不可分割的内容,模拟@功能。
  3. 支持手势操作addTextSpanaddImageSpan均支持手势操作,如点击和长按。

核心代码

@Entry
@Component
struct CommentEditor {
  editorController = new RichEditorController();

  @Builder
  At(str: string) {
    Stack() {
      Text('@' + str).fontColor(Color.Blue)
    }
  }

  build() {
    Column() {
      RichEditor({ controller: this.editorController })
        .width('100%')
        .height(100)
        .backgroundColor(Color.Yellow)
        .onReady(() => {
          this.editorController.addImageSpan($r("app.media.icon"), {
            imageStyle: { size: ["100px", "100px"] }
          });
          this.editorController.addTextSpan('男生女生向前冲', {
            style: { fontColor: Color.Blue, fontSize: 30 }
          });
          this.editorController.addBuilderSpan(() => {
            this.At('华为官方客服')
          });
        });

      Button('添加图片').onClick((event: ClickEvent) => {
        this.editorController.addImageSpan($r("app.media.icon"), {
          imageStyle: { size: ["100px", "100px"] }
        });
      });

      Button('添加文字').onClick((event: ClickEvent) => {
        this.editorController.addTextSpan('新的文字', {
          style: { fontColor: Color.Red, fontSize: 20 }
        });
      });
    }
  }
}

场景二:右下角的剩余字数

实现思路

  1. 显示剩余字数:使用overlay属性在RichEditor组件的右下角显示剩余字数。
  2. 限制输入长度:通过aboutToIMEInput回调限制用户输入的字数。

HarmonyOS开发之RichEditor组件实现评论编辑功能_RichEditor

核心代码

@Entry
@Component
struct MaxLengthEditor {
  @State message: string = '';
  controller: RichEditorController = new RichEditorController();
  @State getContentLength: number = 0;

  build() {
    Column() {
      RichEditor({ controller: this.controller })
        .height(100)
        .borderWidth(1)
        .borderColor(Color.Red)
        .width('100%')
        .overlay(`${this.getContentLength}/20`, {
          align: Alignment.BottomEnd
        })
        .aboutToIMEInput((value: RichEditorInsertValue) => {
          if (this.getContentLength < 20) {
            this.getContentLength += value.insertValue.length;
            return true;
          }
          promptAction.showToast({ message: '已超出内容最大限制.' });
          return false;
        })
        .aboutToDelete((value: RichEditorDeleteValue) => {
          this.getContentLength -= value.length;
          return true;
        });

      Button('输入文字').onClick((event: ClickEvent) => {
        this.controller.addTextSpan('新的文字', {
          style: { fontColor: Color.Blue, fontSize: 20 }
        });
      });
    }
  }
}

场景三:评论中携带所@的用户的附属信息

实现思路

  1. 添加@信息:使用addBuilderSpan方法添加@信息,并绑定点击事件。
  2. 存储和获取附属信息:使用HashMap存储和获取用户的附属信息。

核心代码

@Entry
@Component
struct AtUserInfoEditor {
  controller: RichEditorController = new RichEditorController();

  @Builder
  At(str: string) {
    Stack() {
      Text('@' + str).fontColor(Color.Blue)
    }.onClick(() => {
      const hashMap: HashMap<string, number> = new HashMap();
      hashMap.set("friend1", 123);
      let result = hashMap.get("friend1");
      console.log('result: ' + result);
    })
  }

  build() {
    Column() {
      RichEditor({ controller: this.controller })
        .height(100)
        .borderWidth(1)
        .borderColor(Color.Red)
        .width('100%');

      Button('添加好友1').onClick((event: ClickEvent) => {
        this.controller.addBuilderSpan(() => {
          this.At('好友1')
        });
      });

      Button('添加好友2').onClick((event: ClickEvent) => {
        this.controller.addBuilderSpan(() => {
          this.At('好友2')
        });
      });
    }
  }
}

场景四:文本选择区域发生变化或编辑状态下光标位置发生变化回调

实现思路

  1. 监听光标变化:使用onSelectionChange回调监听光标位置的变化。
  2. 处理光标变化:在回调中处理光标位置变化的逻辑。

HarmonyOS开发之RichEditor组件实现评论编辑功能_RichEditor_02

核心代码

@Entry
@Component
struct CursorChangeEditor {
  @State message: string = '蜡笔小新';
  controller: RichEditorController = new RichEditorController();

  build() {
    Column() {
      RichEditor({ controller: this.controller })
        .defaultFocus(true)
        .padding(0)
        .height(56)
        .width('90%')
        .borderStyle(BorderStyle.Solid)
        .borderColor(Color.Black)
        .borderWidth(1)
        .padding({ left: 10 })
        .onReady(() => {
          this.controller.addTextSpan(this.message, {
            offset: this.controller.getCaretOffset(),
            style: { fontColor: Color.Orange, fontSize: 16 }
          });
          this.controller.setCaretOffset(this.controller.getCaretOffset() + this.message.length);
        })
        .onSelectionChange((value: RichEditorRange) => {
          console.log('光标位置改变了');
          console.log('start: ' + value.start);
          console.log('end: ' + value.end);
        });

      Button('输入文字').onClick((event: ClickEvent) => {
        this.controller.addTextSpan('新的文字', {
          style: { fontColor: Color.Blue, fontSize: 20 }
        });
      });
    }
  }
}

场景五:自由切换系统键盘和自定义键盘

实现思路

  1. 自定义键盘:创建一个自定义键盘组件,支持添加图片和删除内容。
  2. 切换键盘:通过customKeyboard属性控制切换系统键盘和自定义键盘。

核心代码

@Entry
@Component
struct CustomKeyboardEditor {
  @State message: string = 'Hello World';
  controller = new RichEditorController();
  @State showKeyboard: boolean = false;
  private listData: (string | number | Resource)[] = [
    $r('app.media.img'), $r('app.media.img_1'), $r('app.media.img_2'), $r('app.media.img_3'), $r('app.media.img_4'), $r('app.media.img_5'), $r('app.media.img_6'),
    $r('app.media.img'), $r('app.media.img_1'), $r('app.media.img_2'), $r('app.media.img_3'), $r('app.media.img_4'), $r('app.media.img_5'), $r('app.media.img_6'),
    $r('app.media.img'), $r('app.media.img_1'), $r('app.media.img_2'), $r('app.media.img_3'), $r('app.media.img_4'), $r('app.media.img_5'), $r('app.media.img_6'),
    $r('app.media.img'), $r('app.media.img_1'), $r('app.media.img_2'), $r('app.media.img_3'), $r('app.media.img_4'), $r('app.media.img_5'), $r('app.media.img_6'),
    $r('app.media.img'), $r('app.media.img_1'), $r('app.media.img_2'), $r('app.media.img_3'), $r('app.media.img_4'), $r('app.media.img_5'), $r('app.media.img_6'),
  ];

  @Builder
  CustomKeyboardBuilder() {
    Column() {
      Text('自定义表情键盘')
        .fontSize(25)
        .fontWeight(900)
      Grid() {
        ForEach(this.listData, (item: string | number | Resource) => {
          GridItem() {
            if (typeof item !== 'number' && typeof item !== 'string') {
              Image(item)
                .width(30)
                .onClick(() => {
                  this.controller.addImageSpan(item, { imageStyle: { size: ['110px', '110px'] } });
                });
            }
          }
        })
      }.columnsGap(10).rowsGap(10).padding(5)
      Row() {
        Image($r('app.media.img_7'))
          .width(30)
          .onClick(() => {
            this.controller.deleteSpans({ start: this.controller.getCaretOffset() - 1, end: this.controller.getCaretOffset() });
          });
      }.width('100%').justifyContent(FlexAlign.End).margin({ bottom: 40 })
    }.borderColor(Color.Gray).borderWidth(5)
  }

  build() {
    Column() {
      RichEditor({ controller: this.controller })
        .width('100%')
        .height(100)
        .borderWidth(1)
        .borderColor(Color.Black)
        .onReady(() => {
          this.controller.addTextSpan('有序排队');
        })
        .customKeyboard(this.showKeyboard ? this.CustomKeyboardBuilder() : undefined);

      Button('切换系统键盘与自定义键盘').onClick((event: ClickEvent) => {
        this.showKeyboard = !this.showKeyboard;
      });
    }.height('100%')
  }
}

通过以上几个场景的实现,我们可以看到RichEditor组件在HarmonyOS NEXT中提供了非常强大的功能,可以满足多种复杂的编辑需求。

标签:img,Color,media,app,HarmonyOS,controller,onClick,RichEditor,组件
From: https://blog.51cto.com/u_15171169/12056972

相关文章

  • ArkTs通过Web组件和H5交互
    arkts代码//xxx.etsimportweb_webviewfrom'@ohos.web.webview';import{router}from'@kit.ArkUI';import{call}from'@kit.TelephonyKit';import{BusinessError}from'@kit.BasicServicesKit';classtestClass......
  • springcloud负载均衡组件ribbon使用
    一、微服务负载均衡ribbon策略如下:1、线性轮询策略:RoundRibbonRule 2、重试策略:RetryRule3、加权响应时间策略:WeightedResponseTimeRule4、随机策略:RandomRule5、最空闲策略:BestAvailableRule6、区域感知轮询策略:ZoneAvoidanceRule(默认)每个策略对应什么意思,基本也就是字......
  • Vue 依赖注入组件通信:provide / inject 使用详解
    引言在Vue.js中,我们经常会遇到组件之间需要共享数据的情况。一种常见的解决方案是通过props和$emit事件来进行数据传递,但对于多层嵌套的组件结构或共享状态的场景,这种方式显得繁琐而不直观。幸运的是,Vue.js提供了一个稍微优雅的解方案:依赖注入-provide和inject。......
  • 火语言RPA流程组件介绍--设置元素属性值
    ......
  • 【VUE3.0】动手做一套像素风的前端UI组件库---Button
    目录引言做之前先仔细看看UI设计稿解读一下都有哪些元素:素材补充代码编写1.按钮四周边框2.默认状态下按钮颜色立体效果3.鼠标移入聚焦4.模拟鼠标点击效果组件封装1.按类型设置颜色2.设置按钮禁用状态3.处理一个bug4.看下整体组件效果5.完整代码总结引言......
  • 鸿蒙(HarmonyOS)--函数、类的声明和使用
    目录1.函数1.1函数的声明1.2可选参数 1.2.1 参数名?:类型  1.2.2参数名:类型=值 1.3Rest参数 1.4返回类型1.4.1显示返回1.4.2隐示返回1.4.3无返回类型1.5函数的作用域1.5.1全局作用域1.5.2局部作用域1.6函数调用1.7函数类型 1.8 箭头函数/l......
  • 鸿蒙(HarmonyOS)--编程语言-ArkTS 语言基础
    目录 ArkTS基础知识1声明1.1变量声明1.2常量声明1.3自动类型推断 2类型2.1基本类型 2.1.1 string2.1.2  number2.1.3boolean2.2引用类型2.2.1Object类型 2.2.2 Array类型2.2.3Void类型 2.3枚举类型 Enum2.4联合类型 Union 2.5 类型别......
  • # HarmonyOSNEXT应用开发性能优化篇(四)
    本篇是性能优化的最后一篇,合理使用系统接口,前边三篇分别介绍了预加载、布局和状态变量方面上的优化合理使用系统接口,避免冗余操作在使用系统的高频回调接口时,删除不必要的Trace和日志打印,避免冗余操作,以减少系统的开销,优化性能,下边分几个小点进行介绍。避免在系统高频回......
  • Django Auth组件
    文章目录前言一、使用场景二、使用步骤1.验证用户(authenticate()方法)2.注册用户3.退出登陆4.装饰器前言Django的用户认证组件基于以下几个核心概念:1.用户认证:处理用户的登录、注销和密码管理,提供了一个User模型和相关的视图、表单和后台管理功能2.权限和组......
  • VUE框架CLI组件化组件绑定自定义事件时回调函数的this对象------VUE框架
    <template> <div> <!--内置函数的实现步骤--> <!--提供事件源,给事件源绑定事件,编写回调函数,将回调函数和事件进行绑定--> <!--等待事件的触发,事件触发执行回调函数--> <!--组件的自定义事件实现步骤--> <button@click="Hello()">你好</button> <!--给Us......