当前位置: 首页 > 科技观察

HarmonyOS-自定义组件的Slider滑块

时间:2023-03-12 09:50:29 科技观察

了解更多开源请访问:开源基础软件社区https://ost.51cto.com前言最近发表学习相关熟悉HarmonyOS开发,滑块组件在项目开发过程中很有用。本文主要结合HarmonyOS官网的相关组件和通用API实现一个滑块组件。效果演示实现原理1.触发条件是基于HarmonyOS公共事件touchstart和touchmove,分别在手指刚触摸到屏幕和手指触摸到屏幕后移动时触发。2.实现滑块效果。通过touches触摸事件的属性集合返回屏幕触摸点的信息数组,获取被触摸组件左上角的localX距离,动态计算子元素的宽度,实现slider滑块效果。3、实现百分比显示通过HarmonyOS通用方法getBoundingClientRect()获取元素自身的宽度;通过滑动距离去除元素本身的宽度,实现滑块移动的百分比。使用的官方API通用方法getBoundingClientRect()获取元素的大小及其相对于窗口的位置。属性类型widthnumber描述了元素的宽度。heightnumber元素的高度。leftnumber元素左边框距窗口的偏移量。topnumber元素上边框距窗口的偏移量。通用事件名称参数描述是否支持冒泡touchstartTouchEvent手指刚接触屏幕时触发该事件。是5+touchmoveTouchEvent当手指触摸屏幕后移动时触发该事件。它是touchesArray触摸事件的5+属性类型的集合,包括触摸点在屏幕上的信息数组。属性类型描述globalXnumber距屏幕左上角(不包括状态栏)的水平距离。屏幕的左上角是原点。globalYnumber是距离屏幕左上角(不包括状态栏)的垂直距离。屏幕的左上角是原点。localXnumber是距离被触摸组件左上角的水平距离。组件的左上角是原点。localYnumber是距离被触摸组件左上角的垂直距离。组件的左上角是原点。实现过程hml部分:{{progress}}%

{{item}}css部分:.slider-wrapper{width:100%;显示:弹性;对齐项目:居中;弹性方向:列;背景颜色:bisque;}.progressBox{margin-top:50px;显示:弹性;证明内容:居中;对齐项目:居中;}.content{宽度:300px;显示:弹性;对齐项目:居中;弹性方向:列;位置:相对;margin-top:50px;}#slider{宽度:300px;15px;背景色:粉色;显示:弹性;调整内容:中心;}.slider-main{背景颜色:浅绿色;宽度:0;高度:100%;位置:绝对;左:0;top:0;}.dot{border-radius:50px;宽度:25px;高度:25px;背景色:#fff;边框:1px实心#409eff;位置:绝对;顶部:-5px;}.progress{宽度:300px;显示:弹性;证明内容:空格之间;对齐项目:flex-end;font-size:20px;}js部分:通过动态改变子元素的宽度实现slider滑块效果;给小圆dotrelative由于其父元素设置为绝对定位,通过动态改变left的值来移动圆,并将子元素width的宽度赋值给变量dotLeft,小圆移动的效果随滑块可以实现exportdefault{data:{progress:0,//百分比宽度:0,step1:1,//步长stepArr:[0,20,40,60,80,100],dotLeft:-10},boxChoose(e){letbox=this.$element('slider')letwidth=e.touches[0].localX//获取点击时容器的左侧位置this.dotLeft=widthletelementWidth=box.getBoundingClientRect().width-10//元素的宽度-小圆的偏移量//小圆的偏移量的临界值if(this.dotLeft>=elementWidth){this.dotLeft=elementWidth}if(this.dotLeft<=-10){这个。dotLeft=-10}letcompare=elementWidth/(100/this.step1)//根据步长计算每一步的宽度this.width=Math.ceil(width/compare)*comparethis.progress=Math.round(this.width/elementWidth*100)//限制临界值if(this.progress>=100){this.progress=100};if(this.progress<=0){this.progress=0}},}总结这篇文章是我学习鸿蒙动画API的一个练习,也算是一个是一个比较常用的组件,后续的部分功能还有待完善,比如风格、功能等,希望能和大家一起深入了解鸿蒙,共同进步。了解更多开源内容,请访问:开源基础软件社区https://ost.51cto.com。