升级你的HarmonyOS体验:一窥功能引导与拖拽交换的独家技巧

文章目录

    • 前言
    • 项目目录结构
    • 开发流程
      • 主要步骤讲解
      • 关键配置
      • Index.ets 页面讲解
      • 高光组件相关
      • HeaderApp
    • 总结

前言

在当今的移动应用开发领域,为了提供更加友好和直观的用户体验,开发者们通常会集成多种交互功能来增强应用的互动性和易用性。在这些功能中,有两个功能显得尤为重要,它们分别是功能引导和元素拖拽交换。功能引导帮助用户快速熟悉应用的各种操作和特性,而元素拖拽交换则允许用户以直观的方式对界面元素进行个性化排序和布局。本文将深入探讨在HarmonyOS平台上如何实现这两个关键功能。

项目目录结构


├── main
│   ├── ets
│   │   ├── entryability
│   │   │   └── EntryAbility.ets
│   │   ├── model
│   │   │   ├── AttributeModifier.ets         //  声明GridItem动态属性
│   │   │   ├── GridItemDeletionCtrl.ets      // gridItem删除管理
│   │   │   ├── headerIcon.ets                // icon 布局区域
│   │   │   └── iconInfo.ets
│   │   └── pages
│   │       └── Index.ets                     // 入口区域

开发流程

主要步骤讲解

  1. 导入模块:代码首先导入了<font style="color:rgb(26, 32, 41);">@ohos/high_light_guide</font>模块中的多个类,用于创建和管理高亮引导,以及<font style="color:rgb(26, 32, 41);">@ohos.animator</font>模块中的动画参数设置。同时,还导入了自定义的<font style="color:rgb(26, 32, 41);">HeaderApp</font>模型和<font style="color:rgb(26, 32, 41);">promptAction</font>用于显示对话框。
  2. 常量定义:定义了动画的持续时间、延迟、迭代次数、开始和结束的状态等常量。
  3. 组件定义:使用<font style="color:rgb(26, 32, 41);">@Entry</font><font style="color:rgb(26, 32, 41);">@Component</font>装饰器定义了一个名为<font style="color:rgb(26, 32, 41);">Index</font>的结构体组件。
  4. 成员变量:定义了用于构建和管理高亮引导的变量,以及动画参数、监听器等。
  5. **<font style="color:rgb(26, 32, 41);">aboutToAppear</font>**方法:在这个方法中,初始化了高亮引导构建器<font style="color:rgb(26, 32, 41);">HighLightGuideBuilder</font>,并设置了多个引导页面<font style="color:rgb(26, 32, 41);">GuidePage</font>,包括提示文本、高亮形状、动画效果等。
  6. **<font style="color:rgb(26, 32, 41);">build</font>**方法:构建了组件的UI布局,使用<font style="color:rgb(26, 32, 41);">Stack</font>布局包裹了一个<font style="color:rgb(26, 32, 41);">HighLightGuideComponent</font>,并设置了其属性和回调函数。
  7. 布局构建器:定义了多个布局构建器方法(如<font style="color:rgb(26, 32, 41);">highLightComponent</font><font style="color:rgb(26, 32, 41);">firstHigh</font><font style="color:rgb(26, 32, 41);">secondHigh</font><font style="color:rgb(26, 32, 41);">thirdHigh</font><font style="color:rgb(26, 32, 41);">endHigh</font>),用于创建具体的引导页面布局和交互逻辑。
  8. **<font style="color:rgb(26, 32, 41);">endHigh</font>**方法:在最后一个引导页面显示时,通过<font style="color:rgb(26, 32, 41);">promptAction.showDialog</font>显示一个对话框,用户确认后移除高亮引导。

关键配置

项目中我们使用了高亮插件<font style="color:rgb(64, 72, 91);">ohos_highlightguide</font> , 在终端输入 指令

ohpm install @ohos/high_light_guide

来下载依赖, 并进行相关配置, 如下图所示

Index.ets 页面讲解

Index 页面主要做的是高光处理 在页面加载的时候设定高光组件

  aboutToAppear() {// 设定高光组件this.builder = new HighLightGuideBuilder().setLabel('guide').alwaysShow(true)// 总是显示,调试时可以打开.setOnGuideChangedListener(this.visibleChangeListener).setOnPageChangedListener(this.pageChangeListener).addGuidePage(GuidePage.newInstance()// 第一处提示 点击编辑.setEverywhereCancelable(true)// 允许点击任意处关闭.addHighLight('edit').setHighLightIndicator(this.firstHigh).setExitAnimation(this.exitAnimatorParam)).addGuidePage(GuidePage.newInstance() // 设定第二处提示.setEverywhereCancelable(true)// 允许点击任意处关闭.addHighLight( 'high', HighLightShape.OVAL , 20).setHighLightIndicator(this.secondHigh).setExitAnimation(this.exitAnimatorParam)).addGuidePage(GuidePage.newInstance()// 设定第三处提示.setEverywhereCancelable(false)// 要求用户点击"我知道了"才能关闭提示.setHighLightIndicator(this.thirdHigh).setEnterAnimation(this.enterAnimatorParam).setExitAnimation(this.exitAnimatorParam)).addGuidePage(GuidePage.newInstance()// 设定第四处提示 移除高亮引导.setEverywhereCancelable(false).setHighLightIndicator(this.endHigh));}

代码中 addGuidePage 指代的是每一个高光插件, 通过setHighLightIndicator 来引用我们的高光的组件

高光组件相关

本次项目中主要用了 四个高光组件 , 每个组件都进行了不同的定义 , 从而来进行不同的高光展示

@BuilderfirstHigh(){Column(){Image($r("app.media.first_high_icon")).width(20).height(30).margin({right:'20', bottom:'10'})Text($r('app.string.first_high_tip')).textAlign(TextAlign.Center).fontColor(Color.White).textAlign(TextAlign.Start).onClick(() => {if (this.controller) {this.controller.showPage(1);}})}.justifyContent(FlexAlign.End).alignItems(HorizontalAlign.End).width('50%').margin({ left: $r('app.string.first_high_margin'),top:'50'})}@BuildersecondHigh() {Column() {Text('长按可拖动').textAlign(TextAlign.Center).fontColor(Color.White).width('70%').onClick(() => {if (this.controller) {this.controller.showPage(2);}})Image($r("app.media.second_high_icon")).width($r('app.integer.sort_order_width')).height($r('app.integer.sort_order_width')).margin({top:10}).onClick(() => {if (this.controller) {this.controller.showPage(2);}})}.width($r('app.string.percent_one_hundred')).margin({top:10}).alignItems(HorizontalAlign.Center)// position坐标是以页面顶部中心为原点,不包括系统状态栏// .position({ x: this.PosX, y: this.PosY})}@BuilderthirdHigh() {Column() {Text($r('app.string.third_high_tip')).fontColor(Color.Black).backgroundColor($r('app.color.module_back_ground')).textAlign(TextAlign.Center).width($r('app.integer.first_indicator_width')).height($r('app.integer.first_indicator_height')).borderRadius($r('app.integer.border_radius'))Button($r('app.string.third_high_btn')).fontColor(Color.Black).margin($r('app.integer.common_margin')).fontSize($r('app.integer.access_font_size')).backgroundColor($r('app.color.first_direct_background')).border({ width: 1, color: Color.White }).width($r('app.integer.high_light_button_width')).onClick(() => {if (this.controller) {this.controller.showPage(3);}})}.width($r('app.string.percent_one_hundred')).height($r('app.string.percent_one_hundred')).alignItems(HorizontalAlign.Center).justifyContent(FlexAlign.Center)}@BuilderendHigh() {Column().onAppear(() => {promptAction.showDialog({message: $r("app.string.end_high_tip"),buttons: [{text: $r('app.string.confirm_btn'),color: $r('app.color.toast_success_back_ground')}],isModal: false}).then(() => {if (this.controller) {this.controller.remove();}})})}

HeaderApp

在HeaderApp 组件中主要实现的是元素切换功能 ,核心代码如下

  Grid() {ForEach(this.AppDataArr, (item: AppInfo, index: number) => {GridItem() {IconWithNameView({ app: item })}.id(this.AppDataArr.indexOf(item) === SELECT_INDEX ? 'high' : '').onAreaChange((oldValue: Area, newValue: Area) => {this.itemAreaWidth = Number(newValue.width);}).onTouch((event: TouchEvent) => {if (event.type === TouchType.Down) {this.movedItem = this.AppDataArr[index];}}).attributeModifier(this.GridItemDeletion.getModifier(item)).onClick(() => {if (!this.isEdit) {return;}this.GridItemDeletion.deleteGridItem(item, this.itemAreaWidth);})}, (item: AppInfo) => JSON.stringify(item))}.columnsTemplate('1fr 1fr 1fr 1fr 1fr').width($r('app.string.grid_title_width')).layoutWeight(1).supportAnimation(true).editMode(this.isEdit).onItemDragStart((event: ItemDragInfo, itemIndex: number) => {// 在onItemDragStart函数返回自定义组件,可在拖拽过程中显示此自定义组件。return this.pixelMapBuilder();}).onItemDrop((event: ItemDragInfo, itemIndex: number, insertIndex: number, isSuccess: boolean) => {//  执行gridItem切换操作if (isSuccess && insertIndex < this.AppDataArr.length) {this.changeIndex(itemIndex, insertIndex);}})

代码中定义的id 属性 主要为了高光时的元素查找

通过 onItemDragStart 和 onItemDrop 来实现元素的切换效果

同时 IconWithNameView 定义的是每个组件相关的展示内容,代码如下

@Component
struct IconWithNameView {private app: AppInfo = new AppInfo();@Consume isEdit: boolean;build() {Column() {Stack({ alignContent: Alignment.TopEnd }) {Image(this.app.icon).width($r('app.string.icon_width')).height($r('app.string.icon_height')).interpolation(ImageInterpolation.High).syncLoad(true).draggable(false)if (this.isEdit) {Image($r('app.media.del_icon')).width($r('app.string.del_icon_width')).height($r('app.string.del_icon_height')).markAnchor({ x: '-40%', y: '40%' }).draggable(false)}}Text(this.app.name).width($r('app.string.icon_name_width')).fontSize($r('app.string.icon_name_font_size')).maxLines(1).fontColor(Color.Black).textAlign(TextAlign.Center).margin({ top: 1 })}.width($r('app.string.icon_item_width')).height($r('app.string.icon_item_height')).justifyContent(FlexAlign.Center)}
}

好了, 以上就是该项目的核心内容讲解啦

总结

在harmonyos 逐渐强大的道路上每一份案例的支持都是尤为重要的, 期待每一位鸿蒙爱好者都贡献一份力量,共同完善harmonyos 的建设

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

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

相关文章

【机器学习】12-决策树1——概念、特征选择

机器学习10-决策树1 学习样本的特征&#xff0c;将样本划分到不同的类别&#xff08;分类问题&#xff09;或预测连续的数值&#xff08;回归问题&#xff09;。 选择特征&#xff0c;划分数据集&#xff0c;划分完成形成模型&#xff08;树结构&#xff09;&#xff0c;一个…

JavaSE——多线程基础

概述 现代操作系统&#xff08;Windows&#xff0c;macOS&#xff0c;Linux&#xff09;都可以执行多任务。多任务就是同时允许多个任务。例如&#xff1a;播放音乐的同时&#xff0c;浏览器可以进行文件下载&#xff0c;同时可以进行QQ消息的收发。 CPU执行代码都是一条一条顺…

Matlab R2018a怎么下载安装?Matlab R2018a保姆级详细安装教程

Matlab R2018a下载方法&#xff1a; Matlab R2018a安装教程&#xff1a; 1、右击下载好的压缩包&#xff0c;选择解压到Matlab R2018a 2、打开文件夹【R2018a_win64】&#xff0c;右击下面的setup.exe&#xff0c;选择【以管理员身份运行】 3、点击选择【使用文件安装密钥】&a…

IDEA连接数据库报错:Access denied for user ****

使用IDEA开发时&#xff0c;通过Databse连接数据库。多次连接报错&#xff1a;Access denied for user **** 如下所示&#xff1a; ​ ‍ ‍ ​ ‍ 花了不少时间排查&#xff0c;确认账号、密码&#xff0c;后面发现账号后多了个空格&#xff0c;而且不容易发现&#xf…

proteus仿真软件简体中文版网盘资源下载(附教程)

对于电子通信专业的小伙伴来说&#xff0c;今天文章的标题应该不会陌生。Proteus是一款具有广泛应用的仿真软件&#xff0c;它的功能非常强大&#xff0c;适用于所有单片机的仿真工作&#xff0c;能够从原理图、调试、到与电路的协同仿真一条龙全部搞定&#xff0c;受到所有用户…

交叉熵损失函数的使用

交叉熵损失函数 交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;&#xff0c;也称为对数损失&#xff08;Log Loss&#xff09;&#xff0c;是机器学习和深度学习中常用的损失函数之一&#xff0c;尤其在分类问题中。它衡量的是模型预测的概率分布与真实标签的概率…

使用Properties

a.特点 i.它的Key-Value一般都是String-String类型的&#xff0c;可以用Map<String, String>表示。 ii.Java标准库提供Properties来表示一组“配置”。 iii.读写Properties时&#xff0c;使用getProperty()和setProperty()方法&#xff0c;不要调用继承自HashTabled的ge…

开始场景的制作+气泡特效的添加

3D场景或2D场景的切换 1.新建项目时选择3D项目或2D项目 2.如下图操作&#xff1a; 开始前的固有流程 按照如下步骤进行操作&#xff0c;于步骤3中更改Company Name等属性&#xff1a; 本案例分辨率可以如下设置&#xff0c;有能力者可根据需要自行调整&#xff1a; 场景制作…

轻掺杂漏极(LDD)技术

轻掺杂漏极&#xff08;LDD&#xff09;是一种低能量、低电流的注入工艺&#xff0c;通过该工艺在栅极附近形成浅结&#xff0c;以减少靠近漏极处的垂直电场。对于亚微米MOSFET来说&#xff0c;LDD是必需的&#xff0c;以便抑制热电子效应&#xff0c;这种效应会导致器件退化并…

Python进阶学习笔记(一)对象

1.对象模型 在面向对象理论中类和对象是不同的概念&#xff0c;而在python中类也是对象&#xff0c;叫做类型对象。 所以python中的类&#xff0c;实例对象&#xff0c;类型都是对象。 元类型&#xff1a; 在python中实例对象的类型为对应类型的对象&#xff0c;而类型的对象…

14. PEFT:在大模型中快速应用 LoRA

如果你对LoRA还没有一个直观的概念&#xff0c;可以回看这篇文章&#xff1a;《3. 认识 LoRA&#xff1a;从线性层到注意力机制》。 我们将在这里进一步探讨如何快速地在大型预训练模型中应用 LoRA&#xff0c;并解答可能存在的问题&#xff0c;包括&#xff1a; peft 和 lora …

博途TIA v18下载时,需要重启才能安装下载路径是灰色改不了

一、需要重启才能安装 删除下面注册表P开头的文件&#xff1a; 二、下载路径是灰色改不了 注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion里找到C:\Program Files或者C:\Program Files&#xff08;x86&#xff09;&#xff0c;具体哪个看安装的时候对应…

TikTokDownloader 开源项目操作教程

TikTokDownloader TikTokDownloader 是一个开源的多功能视频下载工具&#xff0c;它专门用于从抖音和TikTok平台下载无水印的视频、图集和直播内容。这个工具支持批量下载账号作品、收藏内容&#xff0c;并可以采集详细数据。它提供了命令行和Web界面&#xff0c;具有多线程下…

arm-硬件

一、ARM体系与架构 ARM芯片组成 -- arm 体系中&#xff0c;一般讲到的芯片由两大部分组成&#xff1a;arm的内核、外设 arm内核&#xff1a; -- 其内核主要由&#xff1a;寄存器、指令集、总线、存储器映射规则、中断逻辑主调试组件构成。ARM公司只设计内核&#xff0c;授权给…

java intellij idea开发步骤,使用指南,工程创建与背景色字体配置,快捷键

intellij idea2021 配置背景色&#xff0c;字体大小&#xff0c;主题 快捷键

网站建设模板选择哪种

在选择网站建设模板时&#xff0c;需要考虑多个因素&#xff0c;包括网站的目的、受众、内容类型以及个性化需求等。以下是一些常见的网站建设模板类型&#xff0c;以及它们的特点&#xff0c;希望对你的选择有所帮助。 企业/商务模板&#xff1a; 企业和商务网站通常需要专业、…

14、主机、应用及数据安全解读

数据来源&#xff1a;14.主机、应用及数据安全解读_哔哩哔哩_bilibili

leetcode第十一题:盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示例…

简单题101. 对称二叉树 (python)20240922

问题描述&#xff1a; python: # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right rightclass Solution(object):def isSymm…

Windows内网穿透远程桌面操作指南

1、登录NatCross官网https://www.natcross.com 账密登录或手机验证码登录。 2、点击左侧场景映射&#xff0c;选择【3389远程桌面】点击添加。 3、检查本地ip&#xff1a;127.0.0.1为本机&#xff0c;本地端口默认&#xff1a;3389&#xff0c;点击保存&#xff0c;系统生产成外…