如何通过上下滑动实现亮度和音量调节(ArkUI)

场景说明

在音视频应用中通常可以通过上下滑动来调节屏幕亮度和音量大小,本例即为大家介绍如何实现上述UI效果。

说明:

由于当前亮度和音量调节功能仅对系统应用开发,所以本例仅讲解UI效果的实现。

效果呈现

本例效果如下:

  • 当在屏幕左侧滑动时,可以调节亮度,上滑亮度提升,下滑亮度降低。
  • 当在屏幕右侧滑动时,可以调节音量,上滑音量增大,下滑音量减小。

环境要求

本例基于以下环境开发,开发者也可以基于其他适配的版本进行开发:

  • IDE: DevEco Studio 4.0 Release
  • SDK: Ohos_sdk_public 4.0.10.13 (API Version 10 Release)

实现思路

本例中几个关键的功能点及其实现思路如下:

  • 区分屏幕左右两侧的滑动,从而使其触发不同效果:通过识别触摸点的坐标(event.fingerList[0].localX)来判断滑动是在左侧还是右侧。
  • 区分滑动是上滑还是下滑:通过触摸点在Y轴方向的偏移量(event.offsetY)来识别上滑还是下滑。
  • 上滑和下滑控制亮度和音量的大小:亮度和音量的大小使用环形进度条(Progress组件)来呈现,通过滑动改变Progress的value值。

开发步骤

开发步骤仅呈现关键代码,全量代码请参考完整代码章节;另外,开发者在运行时需要将本例中使用的图片等资源替换为本地资源。

  1. 搭建UI框架。

    Column(){// 添加需要呈现的文本Row(){Text('左侧滑动')Text('右侧滑动')}Stack(){// 亮度调节UIImage($r('app.media.ic_brightness'))Progress({value:this.bright,type:ProgressType.Ring})// 音量调节UIImage($r('app.media.ic_volume'))Progress({value:this.volume,type:ProgressType.Ring})}
    }
  2. 为Column组件添加触摸手势,并通过触摸点的坐标区分左侧滑动和右侧滑动。左右两侧的分界点可以根据屏幕尺寸自行设置,本例采用200为分界点。

    Column(){
    //...
    }
    .gesture(GestureGroup(GestureMode.Exclusive,// 添加触摸手势,并通过direction控制手势滑动方向为上下滑动PanGesture({direction:PanDirection.Vertical}).onActionUpdate((event?:GestureEvent)=>{// 通过event.fingerList[0].localX获取触摸点的横坐标this.fingerPosition = event.fingerList[0].localX// 当触摸点的横坐标>200时,判定触摸点在屏幕右侧,控制音量if (this.fingerPosition > 200){//...}// 当触摸点的横坐标<200时,判定触摸点在屏幕左侧,控制亮度if (this.fingerPosition < 200){//...}}),)
    )
    
  3. 通过触摸点在Y轴方向的偏移量来识别上滑和下滑。

    Column(){// ...
    }
    .gesture(GestureGroup(GestureMode.Exclusive,PanGesture({direction:PanDirection.Vertical}).onActionUpdate((event?:GestureEvent)=>{this.fingerPosition = event.fingerList[0].localX// 当触摸点在Y轴方向的偏移量<0时,滑动方向为上滑if (event.offsetY < 0){// ...// 反之,滑动方向为上滑}else{// ...}}),)
    )
  4. 手势识别之后,通过手势控制Progress的value值,从而调节亮度和音量的大小。

    Column(){// ...Stack(){// 亮度调节UIif (this.fingerPosition != 0 && this.fingerPosition < 200){// 通过变量bright控制亮度进度条的变化Progress({value:this.bright,type:ProgressType.Ring})// 音量调节UI}else if (this.fingerPosition != 0 && this.fingerPosition > 200){// 通过变量volume控制音量进度条的变化Progress({value:this.volume,type:ProgressType.Ring})}}
    }
    .gesture(GestureGroup(GestureMode.Exclusive,PanGesture({direction:PanDirection.Vertical}).onActionUpdate((event?:GestureEvent)=>{this.fingerPosition = event.fingerList[0].localX// 向上滑动if (event.offsetY < 0){// 触摸点在屏幕右侧if (this.volume < 100 && this.fingerPosition > 200){// 音量值增加this.volume += 1}// 触摸点在屏幕左侧if (this.bright < 100 && this.fingerPosition < 200){// 亮度值增加this.bright += 1}// 向下滑动}else{// 触摸点在屏幕右侧if (this.volume > 0 && this.fingerPosition > 200){// 音量值减小this.volume -= 1}// 触摸点在屏幕左侧if (this.bright > 0 && this.fingerPosition < 200){// 亮度值减小this.bright -= 1}}}),)
    )
    

完整代码

本例完整代码如下:

// xxx.ets
@Entry
@Component
struct ChangeVolume{@State volume:number = 0@State bright:number = 0@State fingerPosition:number = 0build(){Column(){// 添加需要呈现的文本Row(){if (this.fingerPosition != 0 && this.fingerPosition < 200){Text('左侧滑动').fontColor('#FD836E').fontSize(20).textAlign(TextAlign.Start).width('85%')}if (this.fingerPosition != 0 && this.fingerPosition > 200){Text('右侧滑动').fontColor('#0AAF88').fontSize(20).textAlign(TextAlign.End).align(Alignment.End).width('100%')}}.width('90%').height('50%').alignItems(VerticalAlign.Bottom)Stack(){// 亮度调节UIif (this.fingerPosition != 0 && this.fingerPosition < 200){Image($r('app.media.ic_brightness')).width(100).aspectRatio(1.0)Progress({value:this.bright,type:ProgressType.Ring}).color('#FD836E').width(105).aspectRatio(1.0)// 音量调节UI}else if (this.fingerPosition != 0 && this.fingerPosition > 200){Image($r('app.media.ic_volume')).width(100).aspectRatio(1.0)Progress({value:this.volume,type:ProgressType.Ring}).color('#0AAF88').width(105).aspectRatio(1.0)}}.width('100%').height('40%')}.width('100%').height('100%').gesture(GestureGroup(GestureMode.Exclusive,// 添加触摸手势,并通过direction控制手势滑动方向为上下滑动PanGesture({direction:PanDirection.Vertical}).onActionUpdate((event?:GestureEvent)=>{// 通过event.fingerList[0].localX获取触摸点的横坐标this.fingerPosition = event.fingerList[0].localX// 向上滑动if (event.offsetY < 0){// 触摸点在屏幕右侧if (this.volume < 100 && this.fingerPosition > 200){// 音量值增加this.volume += 1}// 触摸点在屏幕左侧if (this.bright < 100 && this.fingerPosition < 200){// 亮度值增加this.bright += 1}// 向下滑动}else{// 触摸点在屏幕右侧if (this.volume > 0 && this.fingerPosition > 200){// 音量值减小this.volume -= 1}// 触摸点在屏幕左侧if (this.bright > 0 && this.fingerPosition < 200){// 亮度值减小this.bright -= 1}}}),))}
}

为了能让大家更好的学习鸿蒙 (Harmony OS) 开发技术,这边特意整理了《鸿蒙 (Harmony OS)开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙 (Harmony OS)开发学习手册》

入门必看:https://qr21.cn/FV7h05

  1. 应用开发导读(ArkTS)
  2. 应用开发导读(Java)

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. 构建第一个JS应用
  4. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

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

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

相关文章

k8s-service 7

由控制器来完成集群的工作负载&#xff0c;service&#xff08;微服务&#xff09;是将工作负载的应用暴露出去&#xff0c;从而解决访问问题 作用&#xff1a;无论是在集群内还是集群外&#xff0c;都可以访问pod上的应用&#xff0c;其实现对集群内的应用pod自动发现和负载均…

关于核心转储和GDB调试的理解

Linux应用程序发生Segmentation fault段错误时&#xff0c;如何利用core dump文件定位错误呢&#xff1f; 在 Linux 系统中&#xff0c;常将“主内存”称为核心(core)&#xff0c;而核心映像(core image) 就是 “进程”(process)执行当时的内存内容。当进程发生错误或收到“信…

论文怎么改才能降低重复率

一、引言&#xff1a;智能工具助力&#xff0c;轻松降低论文重复率 论文的重复率是学术写作中的重要问题&#xff0c;如何有效降低重复率成为了许多研究者的关注焦点。如今&#xff0c;智能工具的发展为我们提供了更多选择。本文将介绍几种实用的智能工具&#xff0c;包括快码…

JAVA:深入了解Java中的Synchronized关键字

1、简述 在Java中&#xff0c;多线程编程是一项常见的任务&#xff0c;然而&#xff0c;它也伴随着一系列潜在的问题&#xff0c;比如竞态条件&#xff08;Race Condition&#xff09;和数据不一致性。为了解决这些问题&#xff0c;Java提供了一种同步机制&#xff0c;即synch…

【华为数据之道学习笔记】3-2 基础数据治理

基础数据用于对其他数据进行分类&#xff0c;在业界也称作参考数据。基础数据通常是静态的&#xff08;如国家、币种&#xff09;&#xff0c;一般在业务事件发生之前就已经预先定义。它的可选值数量有限&#xff0c;可以用作业务或IT的开关和判断条件。当基础数据的取值发生变…

5G下行链路中的MIMO

5G MIMO 影响5G MIMO配置的主要因素是天线的数量和层数UE和gNB有一些预定义的表来定义天线端口和层的数量&#xff0c;选择了特定的表&#xff0c;UE如何确定表中的哪一行用于gNB的每次传输DCI 1-1中该规定了Antenna port 和 层数DMRS 端口数表示正在使用的天线数量&#xff0…

波奇学Linux:Linux进程状态,进程优先级

编写一个程序模拟进程 查看进程状态 修改代码后发现进程状态为由S变成R R为运行态&#xff0c;S为阻塞态 第一次为S是因为调用了外设&#xff08;printf调用屏幕外设&#xff09;&#xff0c;实际上应该为R&#xff0c;S状态轮换&#xff0c;但是R太快了&#xff0c;所以每次…

中国区县人工智能企业数量,shp/excel格式,数据全,覆盖2010-2023年

基本信息. 数据名称: 中国区县人工智能企业数量 数据格式: Shpexcel 数据时间: 2010-2023年 数据几何类型: 面 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据字段&#xff1a;见【吧唧数据】www.bajidata.com 1a2023人工智能企业数量&#xff08;个&…

模块二——滑动窗口:3.无重复字符的最长子串

文章目录 题目描述算法原理解法⼀&#xff1a;暴⼒求解&#xff08;不会超时&#xff0c;可以通过&#xff09;解法二&#xff1a;滑动窗口 代码实现解法⼀&#xff1a;暴⼒求解(时间复杂度为O(N^2^)&#xff0c;空间复杂度为O(1))解法二&#xff1a;滑动窗口(时间复杂度为O(N)…

LeetCode-合并有序链表问题

合并两个有序链表 题目描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 思路&#xff1a; 首先建立一个头节点方便后续操作&#xff0c;然后开始循环将两个链表的节点值进行比较&#xff0c;如果list1节…

hbuiler中使用npm安装datav

注&#xff1a;datav边框样式目前使用时&#xff1a;适用于网页&#xff0c;不适用于app 1、先安装node 安装、配置Node路径 2、为Node配置环境变量 3、在hbuilder的设置中填写node的路径 配置 4、打开cmd输入npm install jiaminghi/data-view 安装dataV&#xff0c;&…

MicroSD 卡 使用读卡器 读取速度测试

设备 - - 电脑为m.2固态硬盘 usb口为USB3.2 gen2接口(即支持1GB/s的接口) cpu: amd3600 测试方案1 直接MicroSD卡放入读卡器测试 38MB/s 从sd卡复制到本地C盘 测试方案2 MicroSD卡使用闪迪的SD卡套套上之后一起插入读卡器 76MB/s 从sd卡复制到本地C盘

uni-app应用设置 可以根据手机屏幕旋转进行 (横/竖) 屏切换

首先 我们打开项目的 manifest.json 在左侧导航栏中找到 源码视图 然后找到 app-plus 配置 在下面加上 "orientation": [//竖屏正方向"portrait-primary",//竖屏反方向"portrait-secondary",//横屏正方向"landscape-primary",//横屏…

Mybatis核心配置文件加载流程详解

Mybatis核心配置文件加载流程详解 本文将介绍MyBatis在配置文件加载的过程中&#xff0c;如何加载核心配置文件、如何解析映射文件中的SQL语句以及每条SQL语句如何与映射接口的方法进行关联。 映射配置文件 在介绍核心配置文件加载流程前&#xff0c;先给出一个简单的MyBati…

ROS gazebo 机器人仿真,环境与robot建模,添加相机 lidar,控制robot运动

b站上有一个非常好的ros教程234仿真之URDF_link标签简介-机器人系统仿真_哔哩哔哩_bilibili&#xff0c;推荐去看原视频。 视频教程的相关文档见&#xff1a;6.7.1 机器人运动控制以及里程计信息显示 Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 本文对视频教程…

Docker入门指南:从基础到实践

在当今软件开发领域&#xff0c;Docker已经成为一种不可或缺的工具。通过将应用程序及其依赖项打包成轻量级的容器&#xff0c;Docker实现了开发、测试和部署的高度一致性。本文将深入研究Docker的基本概念&#xff0c;并通过详细的示例代码演示如何应用这些概念于实际场景中。…

基于FPGA的视频接口之高速IO(光纤)

简介 对于高速IO口配置光纤,现在目前大部分开发板都有配置,且也有说明,在此根据自己的工作经验以及对于各开发板的说明归纳 通过高速IO接口,以及硬件配置,可以实现对于光纤的收发功能,由于GTX的速率在500Mbs到10Gbps之间,但通道高速io可配置光纤10G硬件,物理通完成,则…

掌握 Python sympy 库的高级计算技巧

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Sympy是Python中一个强大的符号计算库&#xff0c;为数学和科学计算提供了丰富的功能。本文将深入介绍Sympy库的各项功能&#xff0c;并提供丰富的示例代码&#xff0c;以帮助大家更好地理解和应用这一工具。 S…

【论文精读】REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS

REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS 前言ABSTRACT1 INTRODUCTION2 REACT: SYNERGIZING REASONING ACTING3 KNOWLEDGE-INTENSIVE REASONING TASKS3.1 SETUP3.2 METHODS3.3 RESULTS AND OBSERVATIONS 4 DECISION MAKING TASKS5 RELATED WORK6 CONCLUSI…

SpringBoot整合ActiveMQ

SpringBoot整合ActiveMQ 文章目录 SpringBoot整合ActiveMQ下载与安装SpringBoot整合ActiveMQ导坐标改配置&#xff0c;默认的保存位置生产与消费消息实现监听类——实现消息自动消费监听器转发消息&#xff1a;流程性业务消息消费完转入下一个消息队列 下载与安装 https://act…