【每日学点HarmonyOS Next知识】span问题、组件标识属性、属性动画回调、图文混排、相对布局问题
1、HarmonyOS 如果有两个span 第一个span放的是中文 第二个span超长 这时候 Ellipsis会展示异常?
如果有两个span 第一个span放的是中文 第二个span超长 这时候 Ellipsis会展示异常
设置断行规则.wordBreak(WordBreak.BREAK_ALL)即可。
参考连接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-basic-components-text-V5#ZH-CN_TOPIC_0000001893209429__wordbreak11
2、HarmonyOS 如何获取控件的组件标识属性?
可以通过getInspectorByKey9+getInspectorByKey(id: string): string来获取指定id的组件的所有属性,不包括子组件信息。参考示例代码如下:
// xxx.ets
import { IntentionCode } from '@ohos.multimodalInput.intentionCode'class Utils {static rect_left: numberstatic rect_top: numberstatic rect_right: numberstatic rect_bottom: numberstatic rect_value: Record<string, number>//获取组件所占矩形区域坐标static getComponentRect(key:string):Record<string, number> {let strJson = getInspectorByKey(key)let obj:Record<string, string> = JSON.parse(strJson)console.info("[getInspectorByKey] current component obj is: " + JSON.stringify(obj))let rectInfo:string[] = JSON.parse('[' + obj.$rect + ']')console.info("[getInspectorByKey] rectInfo is: " + rectInfo)Utils.rect_left = JSON.parse('[' + rectInfo[0] + ']')[0]Utils.rect_top = JSON.parse('[' + rectInfo[0] + ']')[1]Utils.rect_right = JSON.parse('[' + rectInfo[1] + ']')[0]Utils.rect_bottom = JSON.parse('[' + rectInfo[1] + ']')[1]return Utils.rect_value = {"left": Utils.rect_left, "top": Utils.rect_top, "right": Utils.rect_right, "bottom": Utils.rect_bottom}}
}@Entry
@Component
struct IdExample {@State text: string = ''build() {Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {Button() {Text('onKeyTab').fontSize(25).fontWeight(FontWeight.Bold)}.margin({ top: 20 }).backgroundColor('#0D9FFB').onKeyEvent(() => {this.text = "onKeyTab"})Button() {Text('click to start').fontSize(25).fontWeight(FontWeight.Bold)}.margin({ top: 20 }).onClick(() => {console.info(getInspectorByKey("click"))console.info(JSON.stringify(getInspectorTree()))this.text = "Button 'click to start' is clicked"setTimeout(() => {sendEventByKey("longClick", 11, "") // 向id为"longClick"的组件发送长按事件}, 2000)}).id('click')Button() {Text('longClick').fontSize(25).fontWeight(FontWeight.Bold)}.margin({ top: 20 }).backgroundColor('#0D9FFB').gesture(LongPressGesture().onActionEnd(() => {console.info('long clicked')this.text = "Button 'longClick' is longclicked"setTimeout(() => {let rect = Utils.getComponentRect('onTouch') // 获取id为"onTouch"组件的矩形区域坐标let touchPoint: TouchObject = {id: 1,type: TouchType.Down,x: rect.left + (rect.right - rect.left) / 2, // 相对于组件左上角的水平方向坐标y: rect.top + (rect.bottom - rect.top) / 2, // 相对于组件左上角的垂直方向坐标screenX: rect.left + (rect.right - rect.left) / 2, // 相对于应用窗口左上角的水平方向坐标,API10已废弃,采用windowX替代screenY: rect.left + (rect.right - rect.left) / 2, // 相对于应用窗口左上角的垂直方向坐标,API10已废弃,采用windowY替代windowX: rect.left + (rect.right - rect.left) / 2, // 相对于应用窗口左上角的水平方向坐标windowY: rect.left + (rect.right - rect.left) / 2, // 相对于应用窗口左上角的垂直方向坐标displayX: rect.left + (rect.right - rect.left) / 2, // 相对于设备屏幕左上角的水平方向坐标displayY: rect.left + (rect.right - rect.left) / 2, // 相对于设备屏幕左上角的垂直方向坐标}sendTouchEvent(touchPoint) // 发送触摸事件touchPoint.type = TouchType.UpsendTouchEvent(touchPoint) // 发送触摸事件}, 2000)})).id('longClick')Button() {Text('onTouch').fontSize(25).fontWeight(FontWeight.Bold)}.type(ButtonType.Capsule).margin({ top: 20 }).onClick(() => {console.info('onTouch is clicked')this.text = "Button 'onTouch' is clicked"setTimeout(() => {let rect = Utils.getComponentRect('onMouse') // 获取id为"onMouse"组件的矩形区域坐标let mouseEvent: MouseEvent = {button: MouseButton.Left,action: MouseAction.Press,x: rect.left + (rect.right - rect.left) / 2, // 相对于组件左上角的水平方向坐标y: rect.top + (rect.bottom - rect.top) / 2, // 相对于组件左上角的垂直方向坐标screenX: rect.left + (rect.right - rect.left) / 2, // 相对于应用窗口左上角的水平方向坐标,API10已废弃,采用windowX替代screenY: rect.left + (rect.right - rect.left) / 2, // 相对于应用窗口左上角的垂直方向坐标,API10已废弃,采用windowY替代windowX: rect.left + (rect.right - rect.left) / 2, // 相对于应用窗口左上角的水平方向坐标windowY: rect.left + (rect.right - rect.left) / 2, // 相对于应用窗口左上角的垂直方向坐标displayX: rect.left + (rect.right - rect.left) / 2, // 相对于设备屏幕左上角的水平方向坐标displayY: rect.left + (rect.right - rect.left) / 2, // 相对于设备屏幕左上角的垂直方向坐标stopPropagation: () => {},timestamp: 1,target: {area: {width: 1,height: 1,position: {x: 1,y: 1},globalPosition: {x: 1,y: 1}}},source: SourceType.Mouse,pressure: 1,tiltX: 1,tiltY: 1,sourceTool: SourceTool.Unknown}sendMouseEvent(mouseEvent) // 发送鼠标事件}, 2000)}).id('onTouch')Button() {Text('onMouse').fontSize(25).fontWeight(FontWeight.Bold)}.margin({ top: 20 }).backgroundColor('#0D9FFB').onMouse(() => {console.info('onMouse')this.text = "Button 'onMouse' in onMouse"setTimeout(() => {let keyEvent: KeyEvent = {type: KeyType.Down,keyCode: 2049,keyText: 'tab',keySource: 4,deviceId: 0,metaKey: 0,timestamp: 0,stopPropagation: () => {},intentionCode: IntentionCode.INTENTION_DOWN}sendKeyEvent(keyEvent) // 发送按键事件}, 2000)}).id('onMouse')Text(this.text).fontSize(25).padding(15)}.width('100%').height('100%')}
}
3、HarmonyOS 属性动画是否有对动画执行中的回调监听?
属性动画是否有对动画执行中的回调监听
属性动画没有,Animator动画可以有onFrame回调返回动画的当前进度。
参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-animator-V5#ZH-CN_TOPIC_0000001893369037__onframe12
4、HarmonyOS 图片+文字排列问题?
图片+文字,然后第二行图片又开始从头开始排,这种要如何做
只需要在Text组件添加wordBreak(WordBreak.BREAK_ALL)
5、HarmonyOS RelativeContainer组件缺陷无法实现ui效果?
RelativeContainer组件缺陷无法实现ui效果
- 左侧占满剩余宽度:可未左侧设置layoutWeight属性;
- B高度依赖A高度,A高度自适应:可使用onAreaChange事件动态获取A高度,然后为B设置高度;
- indicator默认边距无法消除:目前swiper内置indicator样式有宽高,不支持修改,可通过调整组件的margin值来适应,也可以自定义indicator;
- 获取swiper组件内容的最大高度:目前没有获取swiper未展示的组件的宽高属性,无法自适应最大子组件的高度,建议设置最大高度来实现。以下是参考demo:
@Entry
@Component
struct Index {private swiperController: SwiperController = new SwiperController()@State rightHeight: Length = 80@State swiperData: string[] = ['',''];@State currentIndex: number = 0;build() {Column() {Text('近期需关注').textAlign(TextAlign.Start).fontSize(20).width('100%')Text('宝宝能独坐啦').margin({bottom:10}).textAlign(TextAlign.Start).width('100%')Row(){Column(){Swiper(this.swiperController){Column(){Text('疫苗对比1').fontSize('20')Text('#流感疫苗选三价还是四价?').textAlign(TextAlign.Start).width('100%')}Column(){Text('疫苗对比2').fontSize('20')Text('#2流感疫苗选三价还是四价?流感疫苗选三价还是四价?流感疫苗选三价还是四价?2')}}.indicator(false).onChange(index => {this.currentIndex = index;})// 自定义indicatorRow({ space: 20 }) {ForEach(this.swiperData, (item: string, index: number) => {Shape() {Rect().width(12).height(5).radius(5).fill(index !== this.currentIndex ? Color.Black : Color.Red).fillOpacity(0.6)}})}.margin({ top: 10 })}.layoutWeight(1) //占用剩余的宽度.backgroundColor(Color.Green).onAreaChange((newA:Area,oldA:Area)=>{this.rightHeight = oldA.height;}).padding(10)Row(){Column(){Image($r('app.media.app_icon')).width(30).height(30)Text("记头围")}Column(){Image($r('app.media.app_icon')).width(30).height(30)Text("记体重")}.margin({left:10})}.backgroundColor(Color.Green).padding({ top: '20.00vp', right: '10.00vp', bottom: '20.00vp', left: '10.00vp' }).margin({left:10}).height(this.rightHeight)}.margin({bottom:10})}.width('100%').padding(10).backgroundColor(Color.Gray)}
}
相关文章:
【每日学点HarmonyOS Next知识】span问题、组件标识属性、属性动画回调、图文混排、相对布局问题
1、HarmonyOS 如果有两个span 第一个span放的是中文 第二个span超长 这时候 Ellipsis会展示异常? 如果有两个span 第一个span放的是中文 第二个span超长 这时候 Ellipsis会展示异常 设置断行规则.wordBreak(WordBreak.BREAK_ALL)即可。 参考连接:http…...
MySQL数据集成:高效数据同步与监控
MySQL数据集成案例分享:user-钉钉部门树-名称刷新 在企业信息系统中,数据的高效流动和准确同步是确保业务连续性和决策支持的重要环节。本文将聚焦于一个具体的系统对接集成案例——将MySQL中的数据集成到另一个MySQL数据库中,方案名称为“u…...
时序数据库TimescaleDB基本操作示例
好的!以下是使用 TimescaleDB 的 Java 示例(基于 JDBC,因为 TimescaleDB 是 PostgreSQL 的扩展,官方未提供独立的 Java SDK): 1. 添加依赖(Maven) <dependency><groupId&g…...
【VBA】WPS/PPT设置标题字体
通过VBA,配合左上角的快速访问工具栏,实现自动化调整 选中文本框的 字体位置、大小、颜色。 配合quicker更加便捷 Sub DisableAutoWrapAndFormat()Dim shp As Shape 检查是否选中了一个形状(文本框)If ActiveWindow.Selection.Typ…...
Python Flask 和数据库系统交互
Python Flask 和数据库系统交互 Python Flask 和数据库系统交互 Python Flask 和数据库系统交互 全栈网页应用程序需要结构化数据的持久性,因此使用数据库的知识和经验是网页开发的先决条件。Python 和Flask 可以与大多数SQL或无SQL数据库系统集成。Python本身附带…...
Qt:事件
目录 处理事件 鼠标事件 键盘事件 定时器事件 窗口事件 虽然 Qt 是跨平台的 C 开发框架,Qt 的很多能力其实是操作系统提供的 只不过 Qt 封装了系统的 API 事件 前面学习过信号槽: 用户进行的各种操作,就可能会产生出信号,可以…...
3个 Vue Scoped 的核心原理
大家好,我是大澈!一个喜欢结交朋友、喜欢编程技术和科技前沿的老程序员👨🏻💻,关注我,科技未来或许我能帮到你! 先用一句话概括 Vue Scoped 的核心原理:Vue 的 scoped…...
物联网IoT系列之MQTT协议基础知识
文章目录 物联网IoT系列之MQTT协议基础知识物联网IoT是什么?什么是MQTT?为什么说MQTT是适用于物联网的协议?MQTT工作原理核心组件核心机制 MQTT工作流程1. 建立连接2. 发布和订阅3. 消息确认4. 断开连接 MQTT工作流程图MQTT在物联网中的应用 …...
工程化与框架系列(26)--前端可视化开发
前端可视化开发 📊 引言 前端可视化是现代Web应用中不可或缺的一部分,它能够以直观的方式展示复杂的数据和信息。本文将深入探讨前端可视化开发的关键技术和最佳实践,包括图表绘制、数据处理、动画效果等方面。 可视化技术概述 前端可视化…...
ubuntu 20.04 C++ 源码编译 cuda版本 opencv4.5.0
前提条件是安装好了cuda和cudnn 点击下载: opencv_contrib4.5.0 opencv 4.5.0 解压重命名后 进入opencv目录,创建build目录 “CUDA_ARCH_BIN ?” 这里要根据显卡查询一下,我的cuda是11,显卡1650,所以是7.5 查询方法1࿱…...
2025-03-07 学习记录--C/C++-PTA 习题8-5 使用函数实现字符串部分复制
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 二、代码(C语言)⭐️ #include <stdio.h> #define MAXN 20void strmcpy( char…...
【星云 Orbit•STM32F4】13. 探索定时器:基本定时器
【星云 Orbit•STM32F4】13. 探索定时器:基本定时器 七律 定时器 芯片之心精巧藏, 定时精准度量长。 初学莫畏千般难, 动手方知妙用强。 为读者提供完整代码,但不提供代码文件,也别做“三键”工程师。唯有自己动手&…...
江科大51单片机笔记【10】蜂鸣器(上)
一、蜂鸣器 1.原理 蜂鸣器是一种将电信号转换为声音信号的器件,常同来产生设备的按键音、报警音等提示信号蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器(外观基本一样)有源蜂鸣器:内部自带振荡源,将正负极接上直流…...
最新版本WebContext构造函数-避坑
import org.thymeleaf.context.IWebContext; import org.thymeleaf.context.WebContext; 当你想把页面信息全部获取出来存到redis缓存中使用时,SpringWebContext在Spring5中报错 SpringWebContext ctx new SpringWebContext(request, response,request.getServlet…...
Java基础系列:深入解析Object类与面向对象编程核心机制
目录 一、Object类:万物之源的方法解析 1. 核心方法全景图 2. 关键方法深度剖析 2.1 equals与hashCode的契约关系 2.2 clone方法的三重陷阱 2.3 finalize方法的死亡警告 二、面向对象三大支柱解析 1. 封装(Encapsulation)安全防线 2…...
Spring Boot API 项目中 HAProxy 与 Nginx 的选择与实践
在开发 Spring Boot 构建的 RESTful API 项目时,负载均衡和反向代理是提升性能与可用性的关键环节。HAProxy 和 Nginx 作为两种流行的工具,经常被用于流量分发,但它们各有侧重。究竟哪一个更适合你的 Spring Boot API 项目?本文将…...
C++ 数据结构详解及学习规划
C++数据结构详解及学习规划 一、C++常用数据结构详解与示例 以下是C++中核心数据结构的分类及具体实现示例: 1. 线性数据结构 a. 数组(Array) • 定义:存储固定大小、同类型元素的连续内存结构。 • 特点:快速随机访问(O(1)),但插入/删除效率低(O(n))。 • 应用场…...
Spring Boot启动流程及源码实现深度解析
Spring Boot启动流程及源码实现深度解析 一、启动流程概述 Spring Boot的启动流程围绕SpringApplication类展开,核心流程可分为以下几个阶段: 初始化阶段:推断应用类型,加载ApplicationContextInitializer和ApplicationListene…...
2025 开发AI软件的应用场景和优势
在人工智能技术持续突破的今天,AI软件开发已从实验室走向千行百业的核心战场。本文深入剖析医疗影像诊断、智能制造预测性维护、金融风控决策链等六大落地场景,揭示AI如何通过算法重构业务流程——某三甲医院通过病理AI系统将诊断效率提升4倍,…...
忘记dedecms后台超级管理员账号和密码的解决方案
解决方案: 方案一、数据库修改: 1、前提是您能登录到数据库后台,登录MySQL数据库管理工具(如phpMyAdmin) 2、打开数据库中的 dede_admin 表,找到管理员记录,将 pwd 字段的值改成 f297a57a5a7…...
Kubernetes中的 iptables 规则介绍
#作者:邓伟 文章目录 一、Kubernetes 网络模型概述二、iptables 基础知识三、Kubernetes 中的 iptables 应用四、查看和调试 iptables 规则五、总结 在 Kubernetes 集群中,iptables 是一个核心组件, 用于实现服务发现和网络策略。iptables 通…...
标量、向量、矩阵与张量:从维度理解数据结构的层次
在数学和计算机科学中,维度描述了数据结构的复杂性,而标量、向量、矩阵、张量则是不同维度的数据表示形式。它们的关系可以理解为从简单到复杂的扩展,以下是详细解析: 1. 标量(Scalar):0维数据 定义:单个数值,没有方向,只有大小。 维度:0维(无索引)。 示例: 温度…...
OpenCV 颜色空间:原理与操作指南
颜色空间原理 RGB 颜色空间 RGB(Red, Green, Blue)是最常见的颜色空间,它通过红、绿、蓝三种颜色通道的不同强度组合来表示颜色。在 OpenCV 中,RGB 图像的每个像素由三个 8 位无符号整数(0 - 255)分别表示…...
Windows 11下Git Bash执行cURL脚本400问题、CMD/PowerShell不能执行多行文本等问题记录及解决方案
问题 在Postman里可成功执行的POST请求: 找到Postman的Code 因为cURL基本上算是行业标准,所以Postman默认选中cURL,支持切换不同的开发语言: 点击上图右上角的复制按钮,得到cURL脚本。 Windows 11家庭版ÿ…...
Mysql配置文件My.cnf(my.ini)配置参数说明
一、my.cnf 配置文件路径:/etc/my.cnf,在调整了该文件内容后,需要重启mysql才可生效。 1、主要参数 basedir path # 使用给定目录作为根目录(安装目录)。 datadir path # 从给定目录读取数据库文件。 pid-file filename # 为mysq…...
利用LLMs准确预测旋转机械(如轴承)的剩余使用寿命(RUL)
研究背景 研究问题:如何准确预测旋转机械(如轴承)的剩余使用寿命(RUL),这对于设备可靠性和减少工业系统中的意外故障至关重要。研究难点:该问题的研究难点包括:训练和测试阶段数据分布不一致、长期RUL预测的泛化能力有限。相关工作:现有工作主要包括基于模型的方法、数…...
【RAG】RAG 系统的基本搭建流程(ES关键词检索示例)
RAG 系统的基本搭建流程 搭建过程: 文档加载,并按一定条件切割成片段将切割的文本片段灌入检索引擎封装检索接口构建调用流程:Query -> 检索 -> Prompt -> LLM -> 回复 1. 文档的加载与切割 # !pip install --upgrade openai…...
记录小白使用 Cursor 开发第一个微信小程序(二):创建项目、编译、预览、发布(250308)
文章目录 记录小白使用 Cursor 开发第一个微信小程序(二):创建项目、编译、预览、发布(250308)一、创建项目1.1 生成提示词1.2 生成代码 二、编译预览2.1 导入项目2.2 编译预览 三、发布3.1 在微信开发者工具进行上传3…...
游戏引擎学习第146天
音高变化使得对齐读取变得不可能,我们可以支持循环声音了。 我们今天的目标是完成之前一段时间所做的音频代码。这个项目并不依赖任何引擎或库,而是一个教育项目,目的是展示从头到尾运行一个游戏所需要的全部代码。无论你对什么方面感兴趣&a…...
nodejs关于后端服务开发的探究
前提 在当前的环境中关于web server的主流开发基本上都是java、php之类的,其中java spring系列基本上占了大头,而python之流也在奋起直追,但别忘了nodejs也是可以做这个服务的,只是位置有点尴尬,现在就来探究下nodejs…...
