HarmonyOS 基于ArkUI(ETS) 实现雷达扫描
HarmonyOS 基于ArkUI(ETS) 实现雷达扫描
作者:杨尚晓 2022-11-02 16:06:54系统 OpenHarmony 通过这个雷达Demo,特别是第三种方法,可以学到了颜色渐变属性中的三种渐变,线性渐变,径向渐变,和角度渐变。也可以学习属性动画的实现。想了解更多关于开源的内容,请访问:
51CTO开源基础软件社区
https://ost.51cto.com
前言
雷达扫描是一个比较有科技感的东西,对于科幻迷来说,科幻电影里基本都能看到的画面,一个大大的屏幕上,可以看到雷达扫描的绿幕效果。下面我们使用三种方式来实现这样的雷达效果。
项目说明
工具版本:DevEco Studio 3.0 ReleaseSDK版本:3.1.1.2(API Version 8 Release)主要组件:canvas, Row, Image效果
使用Image图片组件方式实现使用canvas组件实现使用Row组件的渐变属性实现实现过程
需要注意,一个页面里只能有一个@Entry修饰符,所以,下面三种方法在预览的时候,需要注意注释只保留一个@Entry
1、使用Image方法实现
使用Image组件的方法是最简单的,直接制作两张图片,一张底图,一张扫描的图
将两张图片通过叠加,将扫描的图片通过圆心宣旋转即可,下面使用代码来实现
@Entry@Componentstruct RadarImg {@State angle:number = 0;aboutToAppear(){setTimeout(()=>{this.angle = 360},200)}build(){Row(){Stack(){Image($r("app.media.radar_grid")).width(300).height(300)Image($r('app.media.radar_sector')).width(300).height(300).rotate({z: 1,angle: this.angle}).animation({duration: 2000,curve:Curve.Linear,iterations: -1,})}}.justifyContent(FlexAlign.Center).backgroundColor(0x111111).width('100%').height('100%')}}整体比较简单,旋转主要用到了animation属性,这些在官网API文档可以查看。虽然使用Image组件实现比较简单,但是却是可以实现一些复杂的雷达UI。
2、使用canvas实现
使用canvas实现的需要用到两个组件,第一个是Canvas组件,用来绘制底图网格,第二个是Row组件,使用角渐变属性实现旋转的扇形。这里为什么不都使用canvas实现呢,找了一圈,canvas只有线性渐变和径向渐变,切没有角度渐变属性,所以,为了方便就用了row来实现吧。下面直接上代码。
Row的渐变方式在下一个方法讲解,最终都还是使用animation属性动画实现扇形的旋转效果
@Entry@Componentstruct RadarCanvas {private settings: RenderingContextSettings = new RenderingContextSettings(true);private ctx: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)@State angle:number = 0// 绘制网格drawGrid = (): void => {let ctx = this.ctx;ctx.lineWidth = 1ctx.strokeStyle = 'green'// arr数组是需要绘制的底图圈圈let arr:Array3、使用Row组件实现
使用Row组件实现的方法稍微复杂一些,这里用到了4个Row组件,其实对于前端童鞋来说,这里可能会比较好里一些,其实就是类似通过div和css来实现的,row组件是div,其属性是css样式。
废话不多说,直接上代码开搞
(1)实现圆圈圈
首先使用径向渐变属性(radialGradient)来实现底部圈圈的效果radialGradient属性有几个需要注意的值,radius是渐变的半径,这里使用30。渐变颜色colors组用了三个数据,可以看出,前两个其实是透明度为0的。可以理解为
第一个渐变颜色到第二个渐变颜色用了90%。第二个渐变颜色到第三个渐变颜色,用了10%(100%-90%)。也就是说在渐变半径为30的情况下,有90%是透明的,只有10%是透明到green颜色的,这样得到了一个圈圈。然后又设置了repeating属性(重复着色)为true。所以在半径为150的圆内,可以设置 150 / 3 = 5个圆圈圈。Row().width(300).height(300).borderRadius(150).radialGradient({center: [150,150],radius: 30,colors: [['rgba(0,0,0,0)', 0],['rgba(0,0,0,0)', 0.9],['green', 1],],repeating: true,})我们看看效果:
(2)实现十字架
实现十字架使用了两个Row组件,使用线性渐变属性(linearGradient)分别绘制了一横一竖的效果。可以看到颜色组colors使用了5个颜色来实现,1,2,4,5的颜色都是透明的。
第一个颜色到第二个颜色都是透明的,渐变范围是0到49%。第二个颜色到第三个颜色渐变范围是50% - 49% = 1%,也就是在其50%(中间)的地方绘制了一个1%的green线条第三个颜色到第四个颜色不变。第三个到第五个颜色也是透明,渐变范围也是50%。上面绘制好之后,我们通过angle属性将线条旋转90度得到一个十字架。
Row().width(300).height(300).borderRadius(150).linearGradient({angle: 0,colors: [['rgba(0,0,0,0)', 0],['rgba(0,0,0,0)',0.49],['green',0.5],['rgba(0,0,0,0)',0.5],['rgba(0,0,0,0)',1]]})Row().width(300).height(300).borderRadius(150).linearGradient({angle: 90,colors: [['rgba(0,0,0,0)', 0],['rgba(0,0,0,0)',0.49],['green',0.5],['rgba(0,0,0,0)',0.5],['rgba(0,0,0,0)',1]]})来看看效果:
(3)实现旋转扇形
扇形也是用到Row组件,其角度渐变属性(sweepGradient)来实现的。
Row().width(300).height(300).borderRadius(150).sweepGradient({center: [150,150],start: 0,end: 359,colors: [['rgba(0,0,0,0)',0],['rgba(0,0,0,0)',this.flag],['rgba(0,255,0,0.5)',1],]})来看看效果:
最后设置rotate旋转属性,设置旋转轴为z轴,角度angle为动态更新,这样animation动画属性才会更新。最终代码:扇形的代码:
Row().width(300).height(300).borderRadius(150).sweepGradient({center: [150,150],start: 0,end: 359,colors: [['rgba(0,0,0,0)',0],['rgba(0,0,0,0)',this.flag],['rgba(0,255,0,0.5)',1],]}).rotate({z: 1,angle: this.angle}).animation({duration: 2000,iterations: -1,curve: Curve.Linear})这里添加一个扫描周边设备的效果,动态设置了一个数据源,通过ForEach来动态渲染。
ForEach(this.scanData,(item: any) => {Column(){Image($r('app.media.icon')).width(28).height(28).backgroundColor('#fff').borderRadius(19)Text(item.name).fontColor('#fff').margin({top: 5}).fontSize(10)}.alignItems(HorizontalAlign.Center).position({x: item.x, y: item.y}).scale({x: this.w, y: this.h}).animation({duration: 1000,iterations: 1,curve: Curve.Friction}).opacity(this.opt)})最终的代码:
// 雷达扫描组件@Entry@Componentstruct Radar {@State angle:number = 0;@State scanData: any = []@State w:number = 0;@State h:number = 0;@State opt:number = 1@State flag:number = 0.4aboutToAppear(){setTimeout(()=>{this.angle = 360},200)setTimeout(()=>{animateTo({duration: 1000, // 动画时长curve: Curve.Linear, // 动画曲线iterations: -1, // 播放次数playMode: PlayMode.AlternateReverse, // 动画模式onFinish: () => {console.info('play end')}}, () => {this.opt = 0.3})},2000)setTimeout(()=>{this.scanData = [{id: 1,x: 190,y: 200,name: '空调'},{id: 1,x: 80,y: 240,name: '插座'},]setTimeout(()=>{this.w = 1;this.h = 1;},200)},1000)}build(){Row(){Stack(){Row().width(300).height(300).borderRadius(150).radialGradient({center: [150,150],radius: 30,colors: [['rgba(0,0,0,0)', 0],['rgba(0,0,0,0)', 0.9],['green', 1],],repeating: true,})Row().width(300).height(300).borderRadius(150).linearGradient({angle: 0,colors: [['rgba(0,0,0,0)', 0],['rgba(0,0,0,0)',0.49],['green',0.5],['rgba(0,0,0,0)',0.5],['rgba(0,0,0,0)',1]]})Row().width(300).height(300).borderRadius(150).linearGradient({angle: 90,colors: [['rgba(0,0,0,0)', 0],['rgba(0,0,0,0)',0.49],['green',0.5],['rgba(0,0,0,0)',0.5],['rgba(0,0,0,0)',1]]})Row().width(300).height(300).borderRadius(150).sweepGradient({center: [150,150],start: 0,end: 359,colors: [['rgba(0,0,0,0)',0],['rgba(0,0,0,0)',this.flag],['rgba(0,255,0,0.5)',1],]}).rotate({z: 1,angle: this.angle}).animation({duration: 2000,iterations: -1,curve: Curve.Linear})ForEach(this.scanData,(item: any) => {Column(){Image($r('app.media.icon')).width(28).height(28).backgroundColor('#fff').borderRadius(19)Text(item.name).fontColor('#fff').margin({top: 5}).fontSize(10)}.alignItems(HorizontalAlign.Center).position({x: item.x, y: item.y}).scale({x: this.w, y: this.h}).animation({duration: 1000,iterations: 1,curve: Curve.Friction}).opacity(this.opt)})}.width(300).height(300)}.justifyContent(FlexAlign.Center).width('100%').height('100%').backgroundColor(0x111111)}}来看看最终完整的效果:
git地址
https://gitee.com/yango520/yg-radar。
总结
通过这个雷达demo,特别是第三种方法,可以学到了颜色渐变属性中的三种渐变,线性渐变,径向渐变,和角度渐变。也可以学习属性动画的实现。
想了解更多关于开源的内容,请访问:
51CTO开源基础软件社区
https://ost.51cto.com。
责任编辑:jianghua 来源:51CTO开源基础软件社区 ArkUIETS推荐系统
电脑公司Ghost Win8.1 x32 精选纯净版2022年7月(免激活) ISO镜像高速下载
语言:中文版系统大小:2.98GB系统类型:Win8电脑公司Ghost Win8.1x32位纯净版V2022年7月版本集成了自2022流行的各种硬件驱动,首次进入系统即全部硬件已安装完毕。电脑公司Ghost Win8.1x32位纯净版具有更安全、更稳定、更人性化等特点。集成最常用的装机软件,精心挑选的系统维护工具,加上绿茶独有
微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载
语言:中文版系统大小:5.13GB系统类型:Win11微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Win11 64位 Office办公版(免费)优化 1、保留 Edge浏览器。 2、隐藏“操作中心”托盘图标。 3、保留常用组件(微软商店,计算器,图片查看器等)。 5、关闭天气资讯。
Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载
语言:中文版系统大小:4.75GB系统类型:Win11Ghost Win11 21H2是微软在系统方面技术积累雄厚深耕多年,Ghost Win11 21H2系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Ghost Win11 21H2是微软最新发布的KB5019961补丁升级而来的最新版的21H2系统,以Windows 11 21H2 22000 1219 专业版为基础进行优化,保持原汁原味,系统流畅稳定,保留常用组件
windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载
语言:中文版系统大小:5.31GB系统类型:Win11windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载,微软win11发布快大半年了,其中做了很多次补丁和修复一些BUG,比之前的版本有一些功能上的调整,目前已经升级到最新版本的镜像系统,并且优化了自动激活,永久使用。windows11中文版镜像国内镜像下载地址微软windows11正式版镜像 介绍:1、对函数算法进行了一定程度的简化和优化
微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载
语言:中文版系统大小:5.31GB系统类型:Win11微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载,微软2022年正式推出了win11系统,很多人迫不及待的要体验,本站提供了最新版的微软Windows11正式版系统下载,微软windows11正式版镜像 是一款功能超级强大的装机系统,是微软方面全新推出的装机系统,这款系统可以通过pe直接的完成安装,对此系统感兴趣,想要使用的用户们就快来下载
微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件
语言:中文版系统大小:0MB系统类型:Win11微软Ghost win11 正式版镜像文件是一款由微软方面推出的优秀全新装机系统,这款系统的新功能非常多,用户们能够在这里体验到最富有人性化的设计等,且全新的柔软界面,看起来非常的舒服~微软Ghost win11 正式版镜像文件介绍:1、与各种硬件设备兼容。 更好地完成用户安装并有效地使用。2、稳定使用蓝屏,系统不再兼容,更能享受无缝的系统服务。3、为
雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载
语言:中文版系统大小:4.75GB系统类型:雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载在系统方面技术积累雄厚深耕多年,打造了国内重装系统行业的雨林木风品牌,其系统口碑得到许多人认可,积累了广大的用户群体,雨林木风是一款稳定流畅的系统,一直以来都以用户为中心,是由雨林木风团队推出的Windows11国内镜像版,基于国内用户的习惯,做了系统性能的优化,采用了新的系统
雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO
语言:中文版系统大小:5.91GB系统类型:Win7雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO在系统方面技术积累雄厚深耕多年,加固了系统安全策略,雨林木风win7旗舰版系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。win7 32位旗舰装机版 v2019 05能够帮助用户们进行系统的一键安装、快速装机等,系统中的内容全面,能够为广大用户
相关文章
- word没保存关闭怎么找回来 Word没保存恢复方法【详解】
- Win8系统猎豹浏览器打开网页崩溃怎么解决?
- win7电脑重装系统后没有声音
- windows764位旗舰版纯净最新系统推荐
- win10系统怎样更改字体?win10更改字体的设置办法(图文)
- win8系统还原clear type设置的详细步骤
- Win10电脑无法使用管理员启动应用程序怎么办?
- 打开XP系统计算机管理技巧的两种办法
- 新浪微博红包提现图文图文详细教程_新浪微博
- win8怎样校对电脑时间
- win8系统apache服务启动失败解决方法
- 小编教你win8虚拟内存如何设置
- qq聊天记录在啥地方个文件夹,本文教您打开qq聊天记录保存文件夹
- 下载安装Win11系统收费吗?
- win8.1右键添加关机选项的详细步骤【详解】
- 谁是便携办公王者? 8寸旗舰Win8平板横评
- 电脑误删除文件怎么恢复正常
- Win8图片拖拽到PS图标上无法打开的处理办法
热门系统
- 1华硕笔记本&台式机专用系统 GhostWin7 32位正式旗舰版2018年8月(32位)ISO镜像下载
- 2深度技术 Windows 10 x86 企业版 电脑城装机版2018年10月(32位) ISO镜像免费下载
- 3电脑公司 装机专用系统Windows10 x86喜迎国庆 企业版2020年10月(32位) ISO镜像快速下载
- 4雨林木风 Ghost Win7 SP1 装机版 2020年4月(32位) 提供下载
- 5深度技术 Windows 10 x86 企业版 六一节 电脑城装机版 版本1903 2022年6月(32位) ISO镜像免费下载
- 6深度技术 Windows 10 x64 企业版 电脑城装机版2021年1月(64位) 高速下载
- 7新萝卜家园电脑城专用系统 Windows10 x64 企业版2019年10月(64位) ISO镜像免费下载
- 8新萝卜家园 GhostWin7 SP1 最新电脑城极速装机版2018年8月(32位)ISO镜像下载
- 9电脑公司Ghost Win8.1 x32 精选纯净版2022年5月(免激活) ISO镜像高速下载
- 10新萝卜家园Ghost Win8.1 X32 最新纯净版2018年05(自动激活) ISO镜像免费下载
热门文章
常用系统
- 1系统之家Ghost Win10 64位 专业版v2023.07最新下载
- 2大地Win10 Ghost专业版下载_大地Win10 64位免激活下载V2021.06
- 3win11一键安装版下载-win11一键安装版正式版下载
- 4Win10 20H2下载_Win10 20H2 64位专业版镜像下载
- 5雨林木风 Ghost XP SP3 快速装机版 YN2011.11 下载
- 6深度技术ghostWindows1032位专业安装版 v2023.04免费下载
- 7Win10 22H2纯净版下载_Ghost Win10 22H2 64位纯净版下载
- 8深度技术Ghost Win8.1 x32位 特别纯净版2022年3月(免激活) ISO镜像高速下载
- 9深度技术 Ghost Win10 64位 专业稳定版下载_深度技术 Ghost Win10 64位 极速纯净版下载
- 10Win10 LTSC 2022 精简纯净版下载_win10 LTSC 极度纯净版下载安装