鸿蒙UI系统组件16——富文本编辑器(RichEditor)

news2024/10/12 22:16:58

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。

RichEditor是支持图文混排和文本交互式编辑的组件,通常用于响应用户的对于图文混合内容的输入操作,例如可以输入图片的评论区。下面针对RichEditor的基本使用做一个讨论。

👉🏻 创建一个RichEditor组件

创建一个RichEditor组件的方式有两种:a)不使用属性字符串构建RichEditor组件;b)使用属性字符串构建RichEditor。

⭐️ 不使用属性字符串构建方式接口定义如下:

RichEditor(value: RichEditorOptions)

RichEditorOptions的类图一览如下:

图片

其中RichEditorOptions是富文本组件初始化选项。示例代码如下:

controller: RichEditorController = new RichEditorController();options: RichEditorOptions = { controller: this.controller };RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('创建不使用属性字符串构建的RichEditor组件。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })

示例代码对应的效果如下:

图片

⭐️ 使用属性字符串构建方式接口定义如下:

RichEditor(options: RichEditorStyledStringOptions)

RichEditorStyledStringOptions的类图一览如下:

图片

其中RichEditorStyledStringOptions是富文本组件初始化选项。示例代码如下:

mutableStyledString: MutableStyledString = new MutableStyledString("创建使用属性字符串构建的RichEditor组件。",    [{        start: 0,        length: 5,        styledKey: StyledStringKey.FONT,        styledValue: this.fontStyle    }]);controller: RichEditorStyledStringController = new RichEditorStyledStringController();options: RichEditorStyledStringOptions = {controller: this.controller};RichEditor(this.options)    .onReady(() => {        this.controller.setStyledString(this.mutableStyledString);    })

实例代码对应的效果如下:

👉🏻 为RichEditor设置属性

⭐️ 设置自定义选择菜单

通过bindSelectionMenu设置自定义选择菜单,接口定义为:

bindSelectionMenu(  spanType: RichEditorSpanType,   content: CustomBuilder,   responseType: ResponseType | RichEditorResponseType,  options?: SelectionMenuOptions)// 涉及到的核心数据结构如下enum RichEditorSpanType {  TEXT = 0,  // Span为文字类型。  IMAGE = 1,  // Span为图像类型。  MIXED = 2,  // Span为图文混合类型。  BUILDER = 3,  // Span为BuilderSpan类型。}enum RichEditorResponseType{  LONG_PRESS  // 通过长按触发菜单弹出。  RIGHT_CLICK  // 通过鼠标右键触发菜单弹出。  SELECT  // 通过鼠标选中触发菜单弹出。}interface SelectionMenuOptions {onAppear: MenuOnAppearCallback  //自定义选择菜单弹出时回调。onDisappear: Callback<void>  //自定义选择菜单关闭时回调。}type MenuOnAppearCallback = (start: number, end: number) => void

其中:

    • spanType是菜单的类型,默认值为文字类型;

    • content是菜单的内容;

    • responseType是菜单的响应类型,默认类型为长按;

    • options是菜单的选项,可设置自定义选择菜单弹出或关闭时的回调。

(自定义菜单超长时,建议内部嵌套Scroll组件使用,避免键盘被遮挡)示例代码如下:​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('组件设置了自定义菜单,长按可触发。', {            style: {                fontColor: Color.Black,                fontSize: 18            }        })    })    .bindSelectionMenu(RichEditorSpanType.TEXT, this.SystemMenu, ResponseType.LongPress, {        onDisappear: () => {            this.sliderShow = false        }    })    .width(300)    .height(300)@BuilderSystemMenu() {    Column() {            Menu() {                    if (this.controller) {                        MenuItemGroup() {                            MenuItem({                                startIcon: this.theme.cutIcon,                                content: "剪切",                                labelInfo: "Ctrl+X",                            })                            MenuItem({                                startIcon: this.theme.copyIcon,                                content: "复制",                                labelInfo: "Ctrl+C"                            })                            MenuItem({                                startIcon: this.theme.pasteIcon,                                content: "粘贴",                                labelInfo: "Ctrl+V"                            })                        }                    }                }                .radius(this.theme.containerBorderRadius)                .clip(true)                .backgroundColor(Color.White)                .width(this.theme.defaultMenuWidth)        }        .width(this.theme.defaultMenuWidth)}

效果如下

图片

⭐️ 设置光标和手柄颜色

添加文本内容,如果组件光标闪烁,插入后光标位置更新为新插入文本的后面,返回值为添加完成的TextSpan所在的位置。接口定义如下:​​​​​​​

addTextSpan(value: string, options?: RichEditorTextSpanOptions): number// options涉及的接口定义如下:interface RichEditorTextSpanOptions {  offset: number //添加文本的位置。省略时,添加到所有内容的最后。当值小于0时,放在所有内容最前面;当值大于所有内容长度时,放在所有内容最后面。  style: RichEditorTextStyle // 文本样式信息。省略时,使用系统默认文本信息。  paragraphStyle: RichEditorParagraphStyle //段落样式。  gesture: RichEditorGesture // 行为触发回调。省略时,仅使用系统默认行为。}

示例:通过caretColor设置输入框光标、手柄颜色。​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('组件设置了光标手柄颜色。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .caretColor(Color.Orange)    .width(300)    .height(300)

效果如下:

⭐️ 设置空态提示文本(placeholder)

通过placeholder设置无输入时的提示文本。

其中value为无输入时的提示文本;style为添加提示文本的字体样式,style缺省时默认跟随主题。​​​​​​​

RichEditor(this.options)    .placeholder("此处为提示文本...", {        fontColor: Color.Gray,        font: {            size: 15,            weight: FontWeight.Normal,            family: "HarmonyOS Sans",            style: FontStyle.Normal        }    })    .width(300)    .height(300)

效果如下:

图片

👉🏻 为RichEditor添加事件

⭐️ 初始化完成后的回调

通过onReady来添加组件初始化完成后可触发的回调。示例代码如下:​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('onReady回调内容是组件内预置文本。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })

⭐️ 内容被选中时的回调

通过onSelect来添加组件内容被选中时可触发的回调。(触发该回调有两种方式:可通过鼠标左键按下选择,松开左键后触发回调,也可通过手指选择,松开手指触发回调)​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('选中此处文本,触发onselect回调。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .onSelect((value: RichEditorSelection) => {        this.controller1.addTextSpan(JSON.stringify(value), {            style: {                fontColor: Color.Gray,                fontSize: 10            }        })    })    .width(300)    .height(50)Text('查看回调内容:').fontSize(10).fontColor(Color.Gray).width(300)RichEditor(this.options1)    .width(300)    .height(70)

效果如下:

图片

⭐️ 图文变化前 / 后的回调

通过onWillChange添加图文变化前可触发的回调。通过onDidChange添加图文变化后可触发的回调。

  • onWillChange的callback中:RichEditorChangeValue为图文变化信息;boolean为true时,表示当前图文允许被更改。boolean为false时,表示当前图文不允许被更改。

  • onDidChange的callback中:OnDidChangeCallback为图文变化前后的内容范围。

【使用RichEditorStyledStringOptions构建的RichEditor不支持这两种回调】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('组件内图文变化前,触发回调。\n图文变化后,触发回调。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .onWillChange((value: RichEditorChangeValue) => {        this.controller1.addTextSpan('组件内图文变化前,触发回调:\n' + JSON.stringify(value), {            style: {                fontColor: Color.Gray,                fontSize: 10            }        })        return true;    })    .onDidChange((rangeBefore: TextRange, rangeAfter: TextRange) => {        this.controller1.addTextSpan('\n图文变化后,触发回调:\nrangeBefore:' + JSON.stringify(rangeBefore) + '\nrangeAfter:' + JSON.stringify(rangeBefore), {            style: {                fontColor: Color.Gray,                fontSize: 10            }        })        return true;    })    .width(300)    .height(50)Text('查看回调内容:').fontSize(10).fontColor(Color.Gray).width(300)RichEditor(this.options1)    .width(300)    .height(70)

效果如下:

图片

⭐️ 输入法输入前和完成输入后的回调

通过aboutToIMEInput添加输入法输入内容前可触发的回调。通过onIMEInputComplete添加输入法完成输入后可触发的回调。

  • aboutToIMEInput的callback中:RichEditorInsertValue为输入法将要输入内容信息;boolean为true时,组件执行添加内容操作。boolean为false时,组件不执行添加内容操作。

  • onIMEInputComplete的callback中:RichEditorTextSpanResult为输入法完成输入后的文本Span信息。

【使用RichEditorStyledStringOptions构建的RichEditor组件不支持这两种回调】​​​​​​​

RichEditor(this.options)          .onReady(() => {            this.controller.addTextSpan('输入法输入内容前,触发回调。\n输入法完成输入后,触发回调。' , {              style: {                fontColor: Color.Black,                fontSize: 15              }            })          })          .aboutToIMEInput((value: RichEditorInsertValue) => {            this.controller1.addTextSpan('输入法输入内容前,触发回调:\n'+JSON.stringify(value), {              style: {                fontColor: Color.Gray,                fontSize: 10              }            })            return true;          })          .onIMEInputComplete((value: RichEditorTextSpanResult) => {            this.controller1.addTextSpan('输入法完成输入后,触发回调:\n'+ JSON.stringify(value), {              style: {                fontColor: Color.Gray,                fontSize: 10              }            })            return true;          })          .width(300)          .height(50)Text('查看回调内容:').fontSize(10).fontColor(Color.Gray).width(300)RichEditor(this.options1)    .width(300)    .height(70)

效果如下:

图片

⭐️ 完成粘贴前触发的回调

通过onPaste添加完成粘贴前可触发的回调【由于系统的默认粘贴,只支持纯文本的粘贴。所以我们可以通过该方法,覆盖系统默认行为,实现图文的粘贴】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('对此处文本进行复制粘贴操作可触发对应回调。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .onPaste(() => {        this.controller1.addTextSpan('触发onPaste回调\n', {            style: {                fontColor: Color.Gray,                fontSize: 10            }        })    })    .width(300)    .height(70)

⭐️ 完成剪切前触发的回调

通过onCut添加完成粘贴前可触发的回调【由于系统的默认剪切行为,只支持纯文本的剪切。所以我们可以通过该方法,覆盖系统默认行为,实现图文的剪切】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('对此处文本进行复制粘贴操作可触发对应回调。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .onCut(() => {        this.controller1.addTextSpan('触发onCut回调\n', {            style: {                fontColor: Color.Gray,                fontSize: 10            }        })    })    .width(300)    .height(70)

⭐️ 完成复制前触发的回调

通过onCopy添加完成粘贴前可触发的回调【由于系统的默认复制行为,只支持纯文本的复制。所以我们可以通过该方法,覆盖系统默认行为,实现图文的复制】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('对此处文本进行复制粘贴操作可触发对应回调。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .onCopy(() => {        this.controller1.addTextSpan('触发onCopy回调\n', {            style: {                fontColor: Color.Gray,                fontSize: 10            }        })    })    .width(300)    .height(70)

效果如下:

图片

👉🏻 为RichEditor设置用户预设样式

通过setTypingStyle设置用户预设的样式(其中value是预设样式)。示例如下:​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('点击按钮,改变组件预设样式。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .width(300)    .height(60)Button('setTypingStyle', {        buttonStyle: ButtonStyleMode.NORMAL    })    .height(30)    .fontSize(13)    .onClick(() => {        this.controller.setTypingStyle({            fontWeight: 'medium',            fontColor: Color.Pink,            fontSize: 15,            fontStyle: FontStyle.Italic,            decoration: {                type: TextDecorationType.Underline,                color: Color.Gray            }        })    })

效果如下:

图片

👉🏻 为RichEditor设置背板高亮

通过setSelection设置组件内的内容选中时部分背板高亮(其中selectionStart为选中开始位置,selectionEnd选中结束位置。当selectionStart和selectionEnd均为-1时表示全选,当组件内未获焦出现光标时,调用该接口不产生选中效果)​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('点击按钮在此处选中0-2位置的文本。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .width(300)    .height(60)Button('setSelection(0,2)', {        buttonStyle: ButtonStyleMode.NORMAL    })    .height(30)    .fontSize(13)    .onClick(() => {        this.controller.setSelection(0, 2)    })

效果如下:

图片

👉🏻 添加文本内容

除了直接在组件内输入内容,也可以通过addTextSpan添加文本内容【其中value是文本内容;options是文本选项,用于添加文本的偏移位置和文本样式信息(RichEditorTextSpanOptions), 如果组件光标闪烁,插入后光标位置更新为新插入文本的后面】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('点击按钮在此处添加text。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .width(300)    .height(100)Button('addTextSpan', {        buttonStyle: ButtonStyleMode.NORMAL    })    .height(30)    .fontSize(13)    .onClick(() => {        this.controller.addTextSpan('新添加一段文字。')    })

效果如下:

图片

👉🏻 添加图片内容

通过addImageSpan添加图片内容【其中value是图片内容;options是图片选项,用于添加图片的偏移位置和图片样式信息(RichEditorImageSpanOptions), 添加图片内容,如果组件光标闪烁,插入后光标位置更新为新插入图片的后面】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('点击按钮在此处添加image。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .width(300)    .height(100)Button('addImageSpan', {        buttonStyle: ButtonStyleMode.NORMAL    })    .height(30)    .fontSize(13)    .onClick(() => {        this.controller.addImageSpan($r("app.media.startIcon"), {            imageStyle: {                size: ["57px", "57px"]            }        })    })

效果如下:

图片

👉🏻 添加Builder内容

通过addBuilderSpan添加builder内容【其中value是builder内容;options是builder选项,可通过RichEditorBuilderSpanOptions设置此builder在RichEditor中的index(一个文字为一个单位)】​​​​​​​

@BuilderTextBuilder() {    Row() {            Image($r('app.media.startIcon')).width(50).height(50).margin(16)            Column() {                Text("文本文档.txt").fontWeight(FontWeight.Bold).fontSize(16)                Text("123.45KB").fontColor('#8a8a8a').fontSize(12)            }.alignItems(HorizontalAlign.Start)        }.backgroundColor('#f4f4f4')        .borderRadius("20")        .width(220)}Button('addBuilderSpan', {        buttonStyle: ButtonStyleMode.NORMAL    })    .height(30)    .fontSize(13)    .onClick(() => {        this.my_builder = () => {            this.TextBuilder()        }        this.controller.addBuilderSpan(this.my_builder)    })

效果如下:

图片

👉🏻 添加SymbolSpan内容

可通过addSymbolSpan添加SymbolSpan内容【其中value是SymbolSpan组件内容;options是SymbolSpan组件选项,用于添加SymbolSpan组件的偏移位置和SymbolSpan组件样式信息( RichEditorSymbolSpanOptions ),添加SymbolSpan内容,如果组件光标闪烁,插入后光标位置更新为新插入Symbol的后面】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('点击按钮在此处添加symbol。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .width(300)    .height(100)Button('addSymbolSpan', {        buttonStyle: ButtonStyleMode.NORMAL    })    .height(30)    .fontSize(13)    .onClick(() => {        this.controller.addSymbolSpan($r("sys.symbol.basketball_fill"), {            style: {                fontSize: 30            }        })    })

效果如下:

图片

👉🏻 获取组件内span信息

可通过getSpans获取组件内span信息【其中value是需要获取span范围。返回值为Array,是文本和图片Span信息】​​​​​​​

RichEditor(this.options)    .onReady(() => {        this.controller.addTextSpan('点击按钮获取此处span信息。', {            style: {                fontColor: Color.Black,                fontSize: 15            }        })    })    .width(300)    .height(50)Text('查看getSpans返回值:').fontSize(10).fontColor(Color.Gray).width(300)RichEditor(this.options1)    .width(300)    .height(50)Button('getSpans', {        buttonStyle: ButtonStyleMode.NORMAL    })    .height(30)    .fontSize(13)    .onClick(() => {        this.controller1.addTextSpan(JSON.stringify(this.controller.getSpans()), {            style: {                fontColor: Color.Gray,                fontSize: 10            }        })    })

效果如下:

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

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

相关文章

豆包MarsCode 合伙人计划限时招募中,推广最高赢万元现金!

豆包MarsCode 合伙人计划正式上线啦&#xff01;作为官方推出的推广激励项目&#xff0c;豆包MarsCode 编程助手号召和鼓励所有用户向我们推荐新用户。 现在正式开启首轮合伙人招募&#xff0c;诚邀各位有意愿推广普及 AI 编程产品的伙伴成为我们的合伙人&#xff0c;全国限量…

【Linux】操作系统基础

1.冯诺依曼体系结构介绍 冯诺依曼体系结构如下&#xff1a; 在上图中「输⼊设备」和「输出设备」⼀般被称为计算机的外设&#xff0c;⽽「存储器」在冯 诺依曼体系结构中表示「内存」 输⼊设备⼀般包括&#xff1a;⽹卡、磁盘、键盘、触摸屏等 输出设备⼀般包括&#xff1a;…

用 logfire 提高应用的可观测性

Logfire是由 Pydantic 团队打造的平台, 还有供 app 使用的 library, 我们经常提到对应用要做 LMT(Log, Metrics, Trace), Logfire 可以用来收集、存储、分析和可视化日志数据和应用性能指标。通过集成日志和度量&#xff0c;Logfire 提供了一个统一的界面来管理应用程序和系统的…

时间序列预测(一)——线性回归(linear regression)

目录 一、原理与目的 1、线性回归基于两个的假设&#xff1a; 2、线性回归的优缺点: 3、线性回归的主要目的是&#xff1a; 二、损失函数&#xff08;loss function&#xff09; 1、平方误差损失函数&#xff08;忽略了噪声误差&#xff09; 2、均方误差损失函数 三、随…

springboot项目通过maven的profile功能实现通过不同文件夹的方式来组织不同环境配置文件

写在前面 本文看下springboot项目如何通过文件夹的方式来组织不同环境配置文件。 1&#xff1a;正文 一般的我们写springboot项目时配置文件是这个样子的&#xff1a; appliction.yaml --> 通过spring.profiles.activexxx来激活某个指定后缀的配置文件 application-evn1…

【Java学习笔记】多线程

当我们在饭店聚餐时&#xff0c;多人同时吃一道菜的时候很容易发生争抢。例如&#xff0c;上了一道好菜&#xff0c;两个人同时夹这道菜&#xff0c;一人刚伸出筷子&#xff0c;结果伸到的时候菜已经被夹走了。为了避免这种现象&#xff0c;必须等一人 夹完一口后&#xff0c;另…

【大数据技术基础 | 实验一】配置SSH免密登录

文章目录 一、实验目的二、实验要求三、实验原理&#xff08;一&#xff09;大数据实验一体机&#xff08;二&#xff09;SSH免密认证 四、实验环境五、实验内容和步骤&#xff08;一&#xff09;搭建集群服务器&#xff08;二&#xff09;添加域名映射&#xff08;三&#xff…

工业物联网关-ModbusTCP

Modbus-TCP模式把网关视作Modbus从端设备&#xff0c;主端设备可以通过Modbus-TCP协议访问网关上所有终端设备。用户可以自定义多条通道&#xff0c;每条通道可以配置为TCP Server或者TCP Slave。注意&#xff0c;该模式需要指定采集通道&#xff0c;采集通道可以是串口和网口通…

51WORLD携手浙江科技大学,打造智慧校园新标杆

当前&#xff0c;国家教育数字化战略行动扎实推进&#xff0c;高等教育数字化转型步伐加快。 紧抓数字教育发展战略机遇&#xff0c;浙江科技大学联合51WORLD、正方软件股份有限公司&#xff08;简称&#xff1a;正方软件&#xff09;&#xff0c;共同研发打造浙科大孪生数智校…

为什么很多人宁愿加钱买港版,也不愿买国行 iPhone 16

最近的 iPhone 16 市场&#xff0c;真的是倒反天罡&#xff0c;攻守异形啊。 过去&#xff0c;港版 iPhone 都是性价比的次选&#xff0c;便宜个 10% 都得考虑考虑。但今年&#xff0c;港版 iPhone 16 的价格&#xff0c;反而比国行还贵。 比如&#xff0c;闲鱼上某个卖家&am…

Java消息摘要:MD5验证数据完整性、密码的加密与校验

MD5&#xff08;Message-Digest Algorithm 5&#xff09;是一种被广泛使用的密码散列函数&#xff0c;是一种不可逆的加密算法&#xff0c;该算法可以产生出一个128位&#xff08;16字节&#xff09;的散列值&#xff08;hash value&#xff09;&#xff0c;用于确保信息传输完…

【工具变量】知识产权示范城市DID(2000-2023年)

数据简介&#xff1a;为深入贯彻落实《国家知识产权战略纲要》&#xff0c;强化知识产权治理效能&#xff0c;国家知识产权局制定了《国家知识产权试点、示范城市&#xff08;城区&#xff09;评定和管理办法》&#xff0c;知识产权示范城市成为知识产权强国战略落地的城市支撑…

echarts 入门

工作中第一次碰到echarts&#xff0c;当时有大哥。二进宫没办法&#xff0c;只能搞定它。 感觉生活就是这样&#xff0c;不能解决的问题总是会反复出现。通过看视频、查资料&#xff0c;完成了工作要求。写一篇Hello World&#xff0c;进行备查。 基本使用 快速上手 <!DO…

QNAP新手必看!轻松搞定反向代理设置

反向代理是一种服务器配置&#xff0c;允许你通过一个域名或者IP地址来访问不同的内部应用服务。在QNAP NAS上配置反向代理可以提升应用程序的安全性和可访问性。 准备工作 确保QNAP NAS已连接网络并有公网IPv4/IPv6。 确认已启用Web服务 步骤 1&#xff1a;启用Web服务 登…

相机光学(三十九)——光学暗角与机械暗角

1.什么是暗角 在玩摄影一段时间,拍摄一定数量的照片之后,每个人都会不可避免地遇上一个新问题,那就是暗角现象。所谓暗角,是指在拍摄亮度均匀的场景时,画面的四角却出现与实际景物不符的、亮度降低的现象,又被称为“失光“。 2.暗角的成因 (1)边角的成像光线与镜头光轴…

【智能控制】第2章 专家系统,专家控制,模糊关系,模糊推理,专家PID控制

目录 2.1 专家系统 2.1.1 专家系统概述 2.1.2 专家系统构成 2.1.3 专家系统的建立 1&#xff0e;知识库 2&#xff0e;推理机 3&#xff0e;知识的表示 4&#xff0e;专家系统开发语言 5&#xff0e;专家系统建立步骤 第二节 专家控制 2&#xff0e;功能 3 与专家…

三、账号密码存储

使用Playfers存储 Unity本地持久化类Playerprefs使用详解 - PlaneZhong - 博客园 (cnblogs.com) 一、登陆界面切换 1、登陆界面的脚本&#xff08;机制类脚本&#xff09; 在这个UI上挂载一个脚本LoginWnd 先声明一下这个脚本&#xff0c;拖拽 2、在登录模块中调用 这里的l…

华为全联接大会2024 | 聚焦运维智能化,麒麟信安分享“基于大模型的新一代智能运维平台”

2024年9月19日至21日&#xff0c;以“共赢行业智能化”为主题的华为全联接大会2024在上海世博中心盛大召开。麒麟信安受邀出席大会&#xff0c;与全球的思想领袖、商业精英、技术专家和合作伙伴&#xff0c;共同探讨智能化、数字化技术赋能千行万业&#xff0c;把握新机遇&…

第十五章 Java多线程--线程池

目录 一、线程池基础概念 常见的线程池类型&#xff1a; 创建线程池的例子&#xff1a; 注意事项&#xff1a; 二、线程池使用场景 三、JDK自带的构建线程池的方式 1 newFixedThreadPool 2 newSingleThreadExecutor 3 newCachedThreadPool 4 newScheduleThreadPool …

震撼!一句话就让 AI 帮你做 UI 测试,多模态测试智能体 AUITestAgent 横空出世!

美团到店研发平台携手复旦大学周扬帆教授团队&#xff0c;共同开发了智能化终端测试工具AUITestAgent。该工具是第一个能够基于自然语言测试用例&#xff0c;自动化完成终端UI测试驱动、校验全流程的智能化测试工具。仅需输入自然语言形式的测试需求&#xff0c;AUITestAgent通…