OpenHarmony:RichEditor组件样例开发

使用 richEditor 组件实现一个富文本编辑框,包含富文本编辑区域和功能栏,功能栏中有多个按键,可以调整字体大小、字体样式、字体颜色、布局,并可以插入图片。

api 版本:api11

主页面

import { TitleBar } from '../../../../common/TitleBar';
import { Title } from './Title';@Extend(Column) function cardStyle() {.backgroundColor(Color.White).borderRadius(24).width('100%').padding(5)
}@Entry
@Component
struct RichEditorSample {@State setStyle: Boolean = false;@State setStyle1: Boolean = false;@State setStyle2: Boolean = false;@State setStyle3: Boolean = false;@State setStyle4: Boolean = false;@State setStyle5: Boolean = false;@State setStyle6: Boolean = false;@State styleDialog: Visibility = Visibility.None;@State fontWeightSet: FontWeight = FontWeight.Normal;@State fontStyleSet: FontStyle = FontStyle.Normal;@State fontDecorationSet: TextDecorationType = TextDecorationType.None;@State fontAlignLeftSet: TextAlign = TextAlign.Start;@State fontAlignMiddleSet: TextAlign = TextAlign.Center;@State fontAlignRightSet: TextAlign = TextAlign.End;@State tipsValue: number = 32;private start: number = -1;private end: number = -1;private fontColors: string[] = ["#FA2A2D","#FFBF00","#41BA41","#00AAEE","#3F56EA","#8A2BE2","#000000"];controller: RichEditorController = new RichEditorController();updateVisible(){this.setStyle = !this.setStyle;if(this.setStyle){this.styleDialog = Visibility.Visible;}else{this.styleDialog = Visibility.None;}}updateFontWeight(){this.setStyle1 = !this.setStyle1;if(this.setStyle1){this.fontWeightSet = FontWeight.Bolder;}else{this.fontWeightSet = FontWeight.Normal;}}updateFontStyle(){this.setStyle2 = !this.setStyle2;if(this.setStyle2){this.fontStyleSet = FontStyle.Italic;}else{this.fontStyleSet = FontStyle.Normal;}}updateFontDecoration(){this.setStyle3 = !this.setStyle3;if(this.setStyle3){this.fontDecorationSet = TextDecorationType.Underline;}else{this.fontDecorationSet = TextDecorationType.None;}}updateFontAlignLeft(){this.setStyle4 = !this.setStyle4;if(this.setStyle4){this.fontAlignLeftSet = TextAlign.Start;}else{this.fontAlignLeftSet = TextAlign.JUSTIFY;}}updateFontAlignMiddle(){this.setStyle5 = !this.setStyle5;if(this.setStyle5){this.fontAlignMiddleSet = TextAlign.Center;}else{this.fontAlignMiddleSet = TextAlign.JUSTIFY;}}updateFontAlignRight(){this.setStyle6 = !this.setStyle6;if(this.setStyle6){this.fontAlignRightSet = TextAlign.End;}else{this.fontAlignRightSet = TextAlign.JUSTIFY;}}build() {Column() {TitleBar({ title: $r('app.string.rich_editor_title') })Scroll() {Column() {Title({title:$r('app.string.rich_editor_title')}).height("10%")RichEditor({ controller: this.controller }).onReady(() => {this.controller.addTextSpan("Hello World。\n" +"Familiar images automatically give people a sense of calm and nostalgia. " +"Early web designers liked the elements of the 1980s, but today, the aesthetics of the 1990s.\n",{style:{fontColor: Color.Black,fontSize: 16}})this.controller.addImageSpan($r("app.media.addPhoto"),{imageStyle:{size: ["100px", "54px"]}})}).onSelect((value: RichEditorSelection) => {this.start = value.selection[0];this.end = value.selection[1];}).height("50%").width("100%")Stack() {Column() {Row({ space: 250 }) {Text($r('app.string.rich_editor_style')).fontSize(14).padding({top:5})Image($r('app.media.ic_close')).width(25).height(25).onClick(() => {this.styleDialog = Visibility.None})}.height(25).margin({bottom:10})Row({ space: 38 }) {Image($r('app.media.ic_B_normal')).width(15).height(15).onClick(() => {this.updateFontWeight()if(this.end!=this.start){this.controller.updateSpanStyle({start: this.start,end: this.end,textStyle:{fontWeight: this.fontWeightSet}})}})Image($r('app.media.ic_I_normal')).width(15).height(15).onClick(() => {this.updateFontStyle()if(this.end!=this.start) {this.controller.updateSpanStyle({start: this.start,end: this.end,textStyle:{fontStyle: this.fontStyleSet}})}})Image($r('app.media.ic_U_normal')).width(15).height(15).onClick(() => {this.updateFontDecoration()if(this.end!=this.start) {this.controller.updateSpanStyle({start: this.start,end: this.end,textStyle:{decoration: {type: this.fontDecorationSet}}})}})Image($r('app.media.ic_left_normal')).width(15).height(15).onClick(() => {this.updateFontAlignLeft()if(this.end!=this.start) {this.controller.updateParagraphStyle({start: this.start,end: this.end,style:{textAlign:this.fontAlignLeftSet}})}})Image($r('app.media.ic_middle_normal')).width(15).height(15).onClick(() => {this.updateFontAlignMiddle()if(this.end!=this.start) {this.controller.updateParagraphStyle({start: this.start,end: this.end,style:{textAlign:this.fontAlignMiddleSet}})}})Image($r('app.media.ic_right_normal')).width(15).height(15).onClick(() => {this.updateFontAlignRight()if(this.end!=this.start) {this.controller.updateParagraphStyle({start: this.start,end: this.end,style:{textAlign:this.fontAlignRightSet}})}})}.height(25).margin({bottom:10})Row({ space: 30 }) {ForEach(this.fontColors,(item: string) => {Circle({ width: 15, height: 15 }).fill(item).onClick(() => {if(this.end!=this.start){this.controller.updateSpanStyle({start: this.start,end: this.end,textStyle:{fontColor: item}})}})})}.height(25).margin({bottom:10})Row({ space: 30 }) {Text("Aa").width(24).height(24).fontSize(11).fontWeight(400).onClick(() => {this.tipsValue = this.tipsValue - 2if(this.end!=this.start){this.controller.updateSpanStyle({start: this.start,end: this.end,textStyle:{fontSize: this.tipsValue/2}})}})Slider({ style: SliderStyle.InSet, value: this.tipsValue }).width(210).showTips(true, 'Size:' + this.tipsValue.toFixed()).onChange(value => {this.tipsValue = valueif(this.end!=this.start){this.controller.updateSpanStyle({start: this.start,end: this.end,textStyle:{fontSize: this.tipsValue/2}})}})Text("Aa").width(24).height(24).fontSize(17).fontWeight(400).onClick(() => {this.tipsValue = this.tipsValue + 2if(this.end!=this.start){this.controller.updateSpanStyle({start: this.start,end: this.end,textStyle:{fontSize: this.tipsValue/2}})}})}.height(25).margin({bottom:60})}.visibility(this.styleDialog).width("100%").height("85%").margin({bottom:"85%"}).zIndex(1).border({radius: { topLeft: 15, topRight: 15 },}).backgroundColor($r('app.color.background_light_gray'))Row({ space: 150 }) {Image($r('app.media.ic_textstyle_normal')).width(40).height(40).onClick(() => {this.updateVisible()})Image($r('app.media.ic_picture_normal')).width(35).height(35).onClick(() => {this.controller.addImageSpan($r("app.media.addPhoto"),{imageStyle:{size: ["100px", "54px"]}})})}.padding({top:"50%"}).justifyContent(FlexAlign.Center).width("100%").height("15%").zIndex(3)}.height("30%")}.alignItems(HorizontalAlign.Start).cardStyle().constraintSize({ minHeight: '100%' })}.width('95%').height('80%').backgroundColor($r('app.color.divider_block_color'))}.height('100%').width('100%').backgroundColor($r('app.color.divider_block_color')).padding({ left: 20, right: 20 })}
}

title 组件


@Component
export struct Title {private title!: Resource;build() {Column() {Row() {Text(this.title).fontSize(24).fontWeight(FontWeight.Bold)}.margin({top:"2%",left:"5%"}).width('100%')}.height('100%')}
}

更新字体样式

@State setStyle: Boolean = false;
@State fontWeightSet: FontWeight = FontWeight.Normal;
private start: number = -1;
private end: number = -1;
controller: RichEditorController = new RichEditorController();updateFontWeight(){this.setStyle1 = !this.setStyle1;if(this.setStyle1){this.fontWeightSet = FontWeight.Bolder;}else{this.fontWeightSet = FontWeight.Normal;}
}Image($r('app.media.ic_B_normal')).width(15).height(15).onClick(() => {  this.updateFontWeight()if(this.end!=this.start){this.controller.updateSpanStyle({start: this.start,end: this.end,textStyle:{fontWeight: this.fontWeightSet}})}
})

设置一个 boolean 类型变量 setStyle1,设置字体是否加粗,以 setStyle1 的值来控制

点击加粗按钮,setStyle 变为 true,修改 fontWeightSet 的值,再通过 RichEditor 组件控制器的方法 updateSpanStyle 改变选中字段的样式

自定义字体选择滑动条

@State tipsValue: number = 32;Slider({ style: SliderStyle.InSet, value: this.tipsValue }).width(210).showTips(true, 'Size:' + this.tipsValue.toFixed()).onChange(value => {this.tipsValue = valueif(this.end!=this.start){this.controller.updateSpanStyle({start: this.start,end: this.end,textStyle:{fontSize: this.tipsValue/2}})}})

初始字号为 16,随着 slider 组件的滑动,字号随之变化

总结:

通过 controller.updateSpanStyle 接口修改字体的样式,通过 controller.addImageSpan 来插入图片,使用了 RichEditor、Slider 等组件实现一个富文本编辑功能页面。

注意:

RichEditor 组件框架层未处理拉起输入法时的界面规避,需要应用层处理,代码如下:

import { KeyboardAvoidMode } from '@ohos.arkui.UIContext';onWindowStageCreate(windowStage){windowStage.loadContent('pages/Index', (err, data) => {let a = windowStage.getMainWindowSync().getUIContext().getKeyboardAvoidMode();windowStage.getMainWindowSync().getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.OFFSET);if (err) {Logger.error(TAG, `Failed to load the content. Cause: ${JSON.stringify(err)}`)return}Logger.info(TAG, `Succeeded in loading the content. Data: ${JSON.stringify(data)}`)})
}

在应用 MainAbility/MainAbility.ts 文件中实现

最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

鸿蒙(HarmonyOS NEXT)最新学习路线

  •  HarmonOS基础技能

  • HarmonOS就业必备技能 
  •  HarmonOS多媒体技术

  • 鸿蒙NaPi组件进阶

  • HarmonOS高级技能

  • 初识HarmonOS内核 
  • 实战就业级设备开发

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

《鸿蒙 (OpenHarmony)开发入门教学视频》

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

图片

 《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

图片

 《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

图片

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

图片

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element跑马灯/轮播图,第一页隐藏左边按钮,最后一页隐藏右边按钮(vue 开箱即用)

图示&#xff1a; 第一步&#xff1a; <el-carousel :class"changeIndex0?leftBtnNone:changeIndeximgDataList.length-1? rightBtnNone:" height"546px" :autoplay"false" change"changeNext"><el-carousel-item v-for…

Stata 15 for Mac:数据统计分析新标杆,让研究更高效!

Stata 是一种统计分析软件&#xff0c;适用于数据管理、数据分析和绘图。Stata 15 for Mac 具有以下功能&#xff1a; 数据管理&#xff1a;Stata 提供强大的数据管理功能&#xff0c;用户可以轻松导入、清洗、整理和管理数据集。 统计分析&#xff1a;Stata 提供了广泛的统计…

A Little Is Enough: Circumventing Defenses For Distributed Learning

联邦学习的攻击方法&#xff1a;LIE 简单的总结&#xff0c;只是为了能快速想起来这个方法。 无目标攻击 例如总共50个客户端&#xff0c;有24个恶意客户端&#xff0c;那么这个时候&#xff0c;他需要拉拢2个良性客户端 计算 50 − 24 − 2 50 − 24 0.923 \frac{50-24-2}{…

瑞_23种设计模式_中介者模式

文章目录 1 中介者模式&#xff08;Mediator Pattern&#xff09;1.1 介绍1.2 概述1.3 中介者模式的结构1.4 中介者模式的优缺点1.5 中介者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《2…

Java项目:80 springboot师生健康信息管理系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统的角色&#xff1a;管理员、宿管、学生 管理员管理宿管员&#xff0c;管理学生&#xff0c;修改密码&#xff0c;维护个人信息。 宿管员…

数组类模板(类模拟实现静态数组)

目录 介绍&#xff1a; 案例描述&#xff1a; 思路&#xff1a; 对要求分别分析实现&#xff1a; 创建对应的类&#xff1a; 1.定义一个数组类 2.类中属性有&#xff1a;数组&#xff0c; 容量&#xff0c; 大小 3.数组函数有&#xff1a; 构造函数&#xff08;容量&am…

C++数塔问题

#include <iostream> #include <vector>using namespace std;int main() {// 读取输入int n;cin >> n;vector<vector<int>> tower(n, vector<int>(n));for (int i 0; i < n; i) {for (int j 0; j < i; j) {cin >> tower[i][…

排序---数组和集合

1、数组排序 Arrays.sort(int[] a)这种形式是对一个数组的所有元素进行排序&#xff0c;并且是按照从小到大的排序。 public static void main(String[] args) {Integer []arr {1,2,3,4,5,6};//升序Arrays.sort(arr);for (int x:arr){System.out.print(x " ");}Sys…

Maven:构建现代化软件项目的强大工具

在软件开发的世界中&#xff0c;Maven 是一个备受欢迎的构建工具。它提供了一种标准化、自动化的方式来管理项目的依赖、构建过程和部署。本文将深入探讨 Maven 的各个方面&#xff0c;帮助您更好地理解和使用这一强大的工具。 一、Maven 的简介 Maven 是一个基于项目…

axios请求类型是文件流怎么显示报错信息

axios请求类型是文件流&#xff0c;但是报错信息的话没法显示&#xff0c;在request.js文件中更改一下request拦截器代码&#xff1a; service.interceptors.request.use(config > { ...... , error > { console.log(error, 报错报错) // 处理请求错误 if (error.respons…

IRIS / Chronicles 定义 Item Response Type 字段属性

Response Type 在关系数据库中可能没有这个选项&#xff0c;我们对关系数据库表中的数据返回的数据就是是数据&#xff0c;通常不再做过多定义。 但是 IRIS 会对返回的数据也做一些定义&#xff0c;这个就是我们说的 Response Type。 Single &#xff08;单一&#xff09; 这…

二维随机变量的条件分布-已知X概率密度,X条件下的Y概率密度求解y的概率密度

问题&#xff1a;设数X在区间(0,1)上随机地取值,当观察到Xx(0<x<1)时,数Y在区间(x,1)上随机地取值.求Y的概率密度f(y)&#xff1f; 求解&#xff1a; 首先&#xff0c;数X在区间(0,1)上均匀分布&#xff0c;因此其概率密度函数fX​(x)为&#xff1a; fX​(x)1 0<…

Unity类银河恶魔城学习记录11-7 p109 Aplly item modifiers源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ItemData_Equipment.cs using System.Collections; using System.Collecti…

K8S安装和部署(kubeadmin安装1主2从)

这里用kubeadmin方式进行安装部署 1. 准备三台服务器 服务器地址 节点名称 192.168.190.200 master 主 192.168.190.201 node1 从 192.168.190.202 node2 从 2. 主机初始化&#xff08;所有主机&#xff09; 2.1根据规划设置主机名 #切换到192.168.190.200 hostnamectl…

FastAPI+React全栈开发09 MongoDB的增删改查操作

Chapter02 Setting Up the Document Store with MongoDB 09 MongoDB querying and CRUD operations FastAPIReact全栈开发09 MongoDB的增删改查操作 After all this setting up, downloading, and installing, it is finally time to see MongoDB in action and try to get …

327京东一面

1.项目相关 2.手撕SQL 两道 3.JMeter性能测试 首先&#xff0c;进行基准测试&#xff1a; 单用户测试&#xff08;单用户循环多次得到的数据&#xff09;&#xff1b;为多用户并发执行提供参考 其次&#xff0c;进行负载测试&#xff1a; 通过逐步增加系统负载&#xff0…

大数据学习-2024/3/29-oracle使用介绍

在plsql中登录ORACLE数据。 默认用户&#xff1a; 1、sys&#xff1a; 角色&#xff1a;数据库超级管理员账户。 权限&#xff1a;具有最高的权限&#xff0c;可以执行任何操作&#xff0c;包括操作数据字典和控制文件。可以创建和删除数据库对象&#xff0c;授予和回收其他用户…

Linux系统中安装一些常用的插件备用

Linux系统中安装一些常用的插件备用 1.安装wget yum -y install wget 2.安装vim yum -y install vim-enhanced 3.更换yum源为国内的阿里云源&#xff08;选择&#xff09; 1、备份CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.…

OpenCV的安装与配置

OpenCV安装 OpenCV&#xff0c;全称Open Source Computer Vision Library&#xff0c;是一个开源的计算机视觉库&#xff0c;它包含了大量的图像处理函数和计算机视觉算法。为了更好地学习和应用OpenCV&#xff0c;首先需要将其正确地安装到我们的计算机上。以下是一份关于Ope…

代码随想录算法训练营第二十四天| 理论基础,77. 组合

题目与题解 参考资料&#xff1a;回溯法理论基础 带你学透回溯算法&#xff08;理论篇&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 77. 组合 题目链接&#xff1a;​​​​​​​​​​​​​​77. 组合 代码随想录题解&#xff1a;77. 组合 视频讲解&#xff…