鴻蒙5.0實戰案例:基于RichEditor的評論編輯

往期推文全新看點(文中附帶全新鴻蒙5.0全棧學習筆錄)

?? 鴻蒙(HarmonyOS)北向開發知識點記錄~

?? 鴻蒙(OpenHarmony)南向開發保姆級知識點匯總~

?? 鴻蒙應用開發與鴻蒙系統開發哪個更有前景?

?? 嵌入式開發適不適合做鴻蒙南向開發?看完這篇你就了解了~

?? 對于大前端開發來說,轉鴻蒙開發究竟是福還是禍?

?? 鴻蒙崗位需求突增!移動端、PC端、IoT到底該怎么選?

?? 記錄一場鴻蒙開發崗位面試經歷~

?? 持續更新中……


場景描述

RichEditor是支持圖文混排和文本交互式編輯的組件,在我們使用的APP中是很常見的,比如評論區編輯內容發布、對話框或者聊天室。下面列舉一些遇到的場景需求:

  • 場景一:基于文字圖片以及@信息的好友評論
  • 場景二:右下角的剩余字數
  • 場景三:評論中攜帶所@的用戶的附屬信息
  • 場景四:文本選擇區域發生變化或編輯狀態下光標位置發生變化回調
  • 場景五:自由切換系統鍵盤和自定義鍵盤。

方案描述

場景一:基于文字圖片以及@信息的好友評論

效果圖

方案

1、通過addTextSpan來添加文字,2、通過addImageSpan來添加圖片3、通過addBuilderSpan來實現一段內容光標不可插入的效果4、addTextSpan等支持gesture等手勢操作,比如onClick點擊和onLongPress長按事件

核心代碼

1、由于RichEditor是支持圖文混排的,所以RichEditor里面的內容也就是由Text和Image組成的,分別通過addTextSpan和addImageSpan添加,而且還可以設置字體和圖片樣式,如下代碼1:

@Entry@Componentstruct getSpans {editorController = new RichEditorController()build() {Column() {RichEditor({ controller: this.editorController }).width('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}})})Button('getSpans-圖片').onClick((event: ClickEvent) => {let getSpans = this.editorController.getSpans({ start: 0 })console.log('getSpans0' + JSON.stringify(getSpans[0]))// 必須進行強轉才能獲取文字信息或者圖片信息let span0 = getSpans[0] as RichEditorTextSpanResultconsole.log('圖片相關的信息: ' + JSON.stringify(span0))})Button('getSpans-文字').onClick((event: ClickEvent) => {let getSpans = this.editorController.getSpans({ start: 0 })console.log('getSpans1' + JSON.stringify(getSpans[1]))let span1 = getSpans[1] as RichEditorImageSpanResultconsole.log('文字相關的信息: ' + JSON.stringify(span1))})}}}

2、在常見的評論區艾特好友時,會將“@華為官方客服”視作一個整體,光標無法插入其中,且第一次按刪除鍵時整體會高亮選中,第二次再按刪除鍵才會刪除。**需要注意的是,如果使用的全局@Builder,則需要配合bind(this)使用。**后續也可以通過事件阻止“即RichEditor控件ClickEvent/TouchEvent支持preventDefault”。

@Entry@Componentstruct BuilderSpan {editorController = new RichEditorController()@BuilderAt(str: string) {Stack() {Text('@' + str).fontColor(Color.Blue)}}build() {Column() {RichEditor({ controller: this.editorController }).width('100%').height(50).backgroundColor(Color.Yellow).onReady(() => {this.editorController.addBuilderSpan(() => {this.At('華為官方客服')})this.editorController.addTextSpan('!!!')})}}}

3、發微博的時候可以輸入表情、超鏈接、文字等一起的內容

代碼3:

@Componentstruct Index {@State message: string = '#超話社區#';controller: RichEditorController = new RichEditorController();@State show: boolean = false;build() {Column() {RichEditor({controller: this.controller}).height(56).width("90%").borderStyle(BorderStyle.Solid).borderColor(Color.Black).borderWidth(1).onReady(() => {})Button('輸入表情').onClick((event: ClickEvent) => {this.controller.addImageSpan($r('app.media.app_icon'), {imageStyle: {size: ["80px", "80px"]}})})Button('超鏈接').onClick((event: ClickEvent) => {this.controller.addTextSpan(this.message, {offset: this.controller.getCaretOffset(),style:{fontColor: Color.Orange,fontSize: 16},gesture:{onClick: () => {console.log('要跳轉鏈接了哦')},onLongPress: () => {console.log('我被長按了')}}})this.controller.setCaretOffset(this.controller.getCaretOffset() + this.message.length)})}.width('100%')}}

場景二:右下角的剩余字數

效果圖

方案

使用overlay浮層,顯示“0/20”字數提示符在組件的右下角。再通過aboutToIMEInput回調(輸入法輸入內容前),獲取插入的文本偏移位置,對輸入內容進行限制。

核心代碼

import promptAction from '@ohos.promptAction';@Entry@Componentstruct MaxDemo {@State message: string = '蠟筆小新';controller: RichEditorController = new RichEditorController();@State getContentLength: number = 0;@State BOnSt:promptAction.ShowToastOptions = {'message': '已超出內容最大限制.'}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) => {console.log("insertOffset:" + JSON.stringify(value.insertValue)) // 插入的文本偏移位置。if (this.getContentLength < 20) {this.getContentLength = this.getContentLength + value.insertValue.lengthconsole.log('實時的內容長度:' + this.getContentLength)return true}promptAction.showToast(this.BOnSt)return false}).aboutToDelete((value: RichEditorDeleteValue) => {console.log('刪除:' + JSON.stringify(value))this.getContentLength = this.getContentLength - value.lengthreturn true})}.width('100%')}}

場景三:評論中攜帶所@的用戶的附屬信息

效果圖

方案

使用HashMap的set向HashMap中添加或更新一組數據,使用get方法獲取指定key所對應的value。

核心代碼

@Entry@Componentstruct SameNameDemo {controller: RichEditorController = new RichEditorController();@BuilderAt(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('華為官方客服')})})Button('好友2').onClick((event: ClickEvent) => {this.controller.addBuilderSpan(() => {this.At('華為官方客服')})})}.width('100%')}}

場景四:文本選擇區域發生變化或編輯狀態下光標位置發生變化回調

效果圖

方案

使用RichEditor組件在API 12支持的新接口 onSelectionChange,在文本選擇區域發生變化或編輯狀態下光標位置發生變化時觸發該回調。光標位置發生變化回調時,選擇區域的起始位置等于終止位置(即start = end)。

核心代碼

@Entry@Componentstruct Index {@State message: string = '蠟筆小新';controller: RichEditorController = new RichEditorController();@State show: boolean = false;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)})}.width('100%')}}

場景五:自由切換系統鍵盤和自定義鍵盤

效果圖

方案

使用RichEditor的屬性customKeyboard控制切換系統鍵盤還是自定義鍵盤,添加表情使用addImageSpan,刪除內容使用deleteSpans,并通過獲取光標所在位置進行刪除。

核心代碼

@Entry@Componentstruct Index {@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%').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%')}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70757.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70757.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70757.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過命令啟動steam的游戲

1. 啟動Steam客戶端 在命令行輸入以下命令來啟動Steam客戶端&#xff1a; start steam://open/main 如果Steam未安裝在默認路徑&#xff0c;可能需要先定位到Steam的安裝目錄&#xff0c;例如&#xff1a; cd C:\Program Files (x86)\Steam start steam://open/main 2. 通過…

RIP-AV:使用上下文感知網絡進行視網膜動脈/靜脈分割的聯合代表性實例預訓練

文章目錄 RIP-AV: Joint Representative Instance Pre-training with Context Aware Network for Retinal Artery/Vein Segmentation摘要方法實驗結果 RIP-AV: Joint Representative Instance Pre-training with Context Aware Network for Retinal Artery/Vein Segmentation …

單片機總結【GPIO/TIM/IIC/SPI/UART】

一、GPIO 1、概念 通用輸入輸出口&#xff1b;開發者可以根據自己的需求將其配置為輸入或輸出模式&#xff0c;以實現與外部設備進行數據交互、控制外部設備等功能。簡單來說&#xff0c;GPIO 就像是計算機或微控制器與外部世界溝通的 “橋梁”。 2、工作模式 工作模式性質特…

.gitignore 文件中添加忽略 .pdb 文件

我在項目的根目錄下創建.gitignore文件。打開.gitignore文件并添加忽略.pdb文件的規則。如下&#xff1a; 已經在 .gitignore 文件中添加了忽略 .pdb 文件的規則&#xff0c;但是提交到 Git 倉庫時仍然看到了 .pdb 文件&#xff0c;這通常意味著 .pdb 文件在 .gitignore 文件被…

ubuntu配置jmeter

1.前提準備 系統 ubuntu server 22.04 前提條件&#xff1a;服務器更新apt與安裝lrzsz&#xff1a;更新apt&#xff1a; sudo apt update安裝lrzsz: 命令行下的上傳下載文件工具 sudo apt install lrzszsudo apt install zip2.安裝jemeter 2.1.下載jdk17 輸入命令&#xf…

半導體晶圓精控:ethercat轉profient網關數據提升制造精度

數據采集系統通過網關連接離子注入機&#xff0c;精細控制半導體晶圓制造過程中的關鍵參數。 在半導體制造中&#xff0c;晶圓制造設備的精密控制是決定產品性能的關鍵因素。某半導體工廠采用耐達訊Profinet轉EtherCAT協議網關NY-PN-ECATM&#xff0c;將其數據采集系統與離子注…

VSCode+PlatformIO報錯 找不到頭文件

如圖示&#xff0c;找不到目標頭文件 demo工程運行正常&#xff0c;考慮在src文件夾內開辟自己的代碼&#xff0c;添加后沒有找到 找了些資料&#xff0c;大概記錄如下&#xff1a; 1、c_cpp_properties.json 內記錄 頭文件配置 .vscode 中&#xff0c;此文件是自動生成的&a…

ARM 處理器平臺 eMMC Flash 存儲磨損測試示例

By Toradex秦海 1). 簡介 目前工業嵌入式 ARM 平臺最常用的存儲器件就是 eMMC Nand Flash 存儲&#xff0c;而由于工業設備一般生命周期都比較長&#xff0c;eMMC 存儲器件的磨損壽命對于整個設備來說至關重要&#xff0c;因此本文就基于 NXP i.MX8M Mini ARM 處理器平臺演示…

Comfy UI 快捷鍵

Comfy UI 頁面的快捷鍵操作&#xff08;記錄下&#xff0c;以防忘記&#xff09;&#xff1a; 捷徑命令Ctrl Enter將當前圖表排隊等待生成Ctrl Shift Enter將當前圖表排成第一個生成圖表Ctrl Z/Ctrl Y撤消/重做Ctrl S保存工作流程Ctrl O加載工作流Ctrl A選擇所有節點A…

uniapp 本地數據庫多端適配實例(根據運行環境自動選擇適配器)

項目有個需求&#xff0c;需要生成app和小程序&#xff0c;app支持離線數據庫&#xff0c;如果當前沒有網絡提醒用戶開啟離線模式&#xff0c;所以就隨便搞了下&#xff0c;具體的思路就是&#xff1a; 一個接口和多個實現類&#xff08;類似后端的模板設計模式&#xff09;&am…

HIVE SQL函數之比較函數

背景&#xff1a;今天接到一個臨時需求&#xff0c;需要比較abc的大小&#xff0c;但是abc三個字段都存在為空的情況。 開發&#xff1a;對于這個開發很簡單&#xff0c;因為比較函數有太多了&#xff0c;首先想到的是用case when去進行一個非空的判斷&#xff0c;再去比較用I…

AI探索筆記:淺談人工智能算法分類

人工智能算法分類 這是一張經典的圖片&#xff0c;基本概況了人工智能算法的現狀。這張圖片通過三個同心圓展示了人工智能、機器學習和深度學習之間的包含關系&#xff0c;其中人工智能是最廣泛的范疇&#xff0c;機器學習是其子集&#xff0c;專注于數據驅動的算法改進&#…

進程概念、PCB及進程查看

文章目錄 一.進程的概念進程控制塊&#xff08;PCB&#xff09; 二.進程查看通過指令查看進程通過proc目錄查看進程的cwd和exe獲取進程pid和ppid通過fork()創建子進程 一.進程的概念 進程是一個運行起來的程序&#xff0c;而程序是存放在磁盤的&#xff0c;cpu要想執行程序的指…

OA辦公系統自動滲透測試過程

目錄 一、下載環境源碼 二、部署環境 三、測試 XSS漏洞 SQL注入 文件上傳漏洞 一、下載環境源碼 OA源碼打包地址: https://download.csdn.net/download/weixin_43650289/90434502?spm=1001.2014.3001.5503 二、部署環境

怎么修改node_modules里的文件,怎么使用patch-package修改node_modules的文件,怎么修改第三方庫原文件。

在開發中會遇到需要node_modules里第三方庫有bug&#xff0c;然后需要修改node_modules文件的情況 使用patch-package包可以修改node_modules里的文件 patch-package npm 官網&#xff1a;patch-package - npm 安裝 npm i patch-package 修改文件后 npx patch-package s…

Python在實際工作中的運用-通用格式CSV文件自動轉換XLSX

繼續上篇《Python在實際工作中的運用-CSV無損轉XLSX的幾個方法》我們雖然對特定格式的CSV實現了快速轉換XLSX的目標,但是在運行Py腳本前,還是需要編輯表格創建腳本和數據插入腳本,自動化程度很低,實用性不強,為減少人工提高效率,實現輸入CSV文件路徑即可自動適配完成轉換…

seacmsv9報錯注入

1、seacms的介紹 ? seacms中文名&#xff1a;海洋影視管理系統。是一個采用了php5mysql架構的影視網站框架&#xff0c;因此&#xff0c;如果該框架有漏洞&#xff0c;那使用了該框架的各個網站都會有相同問題。 2、源碼的分析 漏洞的部分源碼如下&#xff1a; <?php …

Hbase客戶端API——語句大全

目錄 創建表&#xff1a; 插入數據&#xff1a; 刪除數據&#xff1a; 修改數據&#xff1a; 查詢數據&#xff1a;Get 查詢數據&#xff1a;Scan 查詢數據&#xff1a;過濾查詢 創建表&#xff1a; 檢驗&#xff1a; 插入數據&#xff1a; 驗證 一次多條數據插入 驗證&…

vscode 版本

vscode官網 Visual Studio Code - Code Editing. Redefined 但是官網只提供最新 在之前的版本就要去github找了 https://github.com/microsoft/vscode/releases 獲取舊版本vscode安裝包的方法_vscode 老版本-CSDN博客

IP------PPP協議

這只是IP的其中一塊內容PPP&#xff0c;IP還有更多內容可以查看IP專欄&#xff0c;前一章內容為網絡類型&#xff0c;可通過以下路徑查看IP---網絡類型-CSDN博客&#xff0c;歡迎指正 3.PPP協議 1.PPP優點 網絡類型&#xff1a;p2p PPP---點到點協議 兼容性會更強凡是接口或…