华为快应用中自定义Slider效果

news2024/11/29 0:42:18

文章目录

  • 一、前言
  • 二、实现代码
  • 三、参考链接

一、前言

在华为快应用中官方提供了<slider>控件,但是这个控件的限制比较多,比如滑块无法自定义,所以这里进行下自定义,自己修改样式。

二、实现代码

整体效果如下:
在这里插入图片描述
源码如下:
custom_slider.ux

<template>
  <div id="container">
    <div id="progress-background"></div>
    <div id="progress-second" style="width: {{progressSecondWidth}}px"></div>
    <div id="slider" style="left: {{left}}px" ontouchmove="handleTouchMove"></div>
  </div>
</template>

<script>
    import prompt from '@system.prompt'
    export default {
        props: [
            'progress',
            'min',
            'max',
            'step'
        ],
        public: {
            progressSecondWidth: 0,
            left: 0,
            right: 0,//右侧可以滑动到的位置
            containerLeft: 0,
            containerRight: 0,
            stepWidth: 1, // 每一步滑动的距离,这个根据step值进行计算
            minDuration: 5, //滑动最小间距,小于这个间距不算滑动
        },
        onInit: function () {
            this.$on('onShow', this.onShow)
            this.$watch('progress', 'progressChange')
        },
        progressChange(newValue, oldValue) {
            console.log('progressChange:' + JSON.stringify(newValue))
            if(newValue === oldValue){
                return
            }
            this.sliderOtherProgress(newValue)
        },
        handleTouchMove(e) {
            let touchX = e.touches[0].clientX - this.containerLeft; // 获取触摸点的全局X坐标
            if (touchX - this.progressSecondWidth < -this.minDuration) {
                this.leftSlide()
            }
            if (touchX - this.progressSecondWidth > this.minDuration) {
                this.rightSlide()
            }
            this.emitChange()
        },
        onShow(e) {
            let that = this
            this.$element('container').getBoundingClientRect({
                success: function (data) {
                    const { top, bottom, left, right, width, height } = data;
                    prompt.showToast({
                        message: `getBoundingClientRect结果: width:${width}, height:${height},
                         top:${top}, bottom:${bottom}, left:${left}, right:${right}`
                    })
                    that.containerLeft = left
                    that.containerRight = right
                    that.right = right - left - 40 //40是滑块的宽度
                    that.computerStepWidth()
                },
                fail: (errorData, errorCode) => {
                    prompt.showToast({
                        message: `错误原因:${JSON.stringify(errorData)}, 错误代码:${errorCode}`
                    })
                },
                complete: function () {
                    console.info('complete')
                }
            })
        },
        //向左滑动
        leftSlide() {
            let nextWidth = this.progressSecondWidth - this.stepWidth
            if (nextWidth <= 0) {
                nextWidth = 0
            }
            this.progressSecondWidth = nextWidth
            this.left = nextWidth;
        },
        //向右滑动
        rightSlide() {
            let nextWidth = this.progressSecondWidth + this.stepWidth
            if (nextWidth >= this.right) {
                nextWidth = this.right
            }
            this.progressSecondWidth = nextWidth
            this.left = nextWidth;
        },
        computerStepWidth() {
            let progressMax = 100;
            let progressMin = 0;
            let progressStep = 1;
            let currentProgress = 0;
            if (this.max) {
                progressMax = this.max
            }
            if (this.min) {
                progressMin = this.min
            }
            if (this.step) {
                progressStep = this.step
            }
            if (this.progress) {
                currentProgress = this.progress
            }
            this.stepWidth = this.right / (progressMax - progressMin) * progressStep //获取每一步滑动的距离
            let currentProgressWidth = this.stepWidth * currentProgress
            this.progressSecondWidth = currentProgressWidth
        },
        sliderOtherProgress(progress){
            let nextWidth = progress + this.stepWidth
            if (nextWidth >= this.right) {
                nextWidth = this.right
            }
            if (nextWidth <= 0) {
                nextWidth = 0
            }
            this.progressSecondWidth = nextWidth
            this.left = nextWidth;
            this.emitChange()
        },
        emitChange() {
            let progress = Math.ceil(this.progressSecondWidth / this.stepWidth)
            this.$emit('change', {
                progress
            })
        }
    }
</script>

<style lang="less">
    #container {
      flex-grow: 1;
      height: 24px;
      display: flex;
    }
    #progress-background {
      flex-grow: 1;
      height: 4px;
      background-color: red;
      margin-top: 10px;
      border-radius: 4px;
    }
    #progress-second {
      height: 4px;
      background-color: pink;
      margin-top: 10px;
      border-radius: 4px;
      left: 0px;
      position: absolute;
    }
    #slider {
      width: 40px;
      height: 24px;
      background-color: #3b2204;
      position: absolute;
      border-radius: 12px;
    }
</style>

使用如下:

<import name="custom-slider" src="./custom_slider"></import>
...
<custom-slider onchange="progressChange" progress="{{customSliderProgress}}"></custom-slider>
<script>
    import prompt from '@system.prompt'
    export default {
    public: {
	    customSliderProgress: 30,
    },
    	progressChange(evt){
      		console.log("--->当前进度",evt.detail.progress);
    	},
    }
</script> 

...

三、参考链接

  1. touch

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

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

相关文章

全网最新最全的Appium自动化:Appium常用操作之等待操作

等待机制&#xff1a; 为了保证脚本的稳定性&#xff0c;有时候需要引入等待时间&#xff0c;等待页面加载元素后再进行操作&#xff0c;主要有三种等待时间设置方式。 方式一&#xff1a; sleep()&#xff1a;固定等待时间设置&#xff0c;python的time包里提供了休眠方法sle…

Windows测试端口连通性(Telnet勾选)

“win““r”之后&#xff0c;telnet地址端口号 在最新版本的Windows中&#xff0c;默认情况下并没有安装Telnet客户端。如果遇到"telnet不是内部或外部命令…"的错误&#xff0c;请手动安装Telnet客户端。你可以在控制面板的"程序和功能"选项卡中找到&quo…

基于Git的代码工程管理——学习记录一

一、Git简概[1] Git是一个分布式版本控制系统&#xff0c;它跟踪任何一组计算机文件的更改&#xff0c;通常用于在软件开发过程中协调协作开发源代码的程序员之间的工作。其为实现快速、数据完整性以及分布式非线性工作流程&#xff08;在不同计算机上运行数千个并行分支&#…

搬运工让你分分钟了解Web接口测试

01、什么是接口 百度说&#xff1a;接口泛指实体把自己提供给外界的一种抽象化物&#xff08;可以为另一实体&#xff09;&#xff0c;用以由内部操作分离出外部沟通方法&#xff0c;使其能被内部修改而不影响外界其他实体与其交互的方式 上面这句有点抽象&#xff0c;网上的…

跨语种「AI同传」颠覆语音翻译!Meta谷歌连发重大突破

Meta谷歌接连放出重磅成果&#xff01;Meta开源无缝交流语音翻译模型&#xff0c;谷歌放出无监督语音翻译重大突破Translation 3。 就在Meta AI成立10周年之际&#xff0c;研究团队重磅开源了在语音翻译领域的突破性进展——「无缝交流」&#xff08;Seamless Communication&a…

python中的输入输出

文章目录 输入函数input()例子1.如何输入获得两个字符串?&#xff08;若输入abc def或abc,def)2.如何输入获得两个整数?&#xff08;若输入34,567)3.如何输入后获得一个元素均为数值型的列表?&#xff08;若输入12,3.4,567或[12,3.4,567]&#xff09; 输出输出函数print()pr…

第十六届山东省职业院校技能大赛 中职组网络建设与运维赛项样题

第十六届山东省职业院校技能大赛 中职组网络建设与运维赛项样题 赛题说明 一、竞赛项目简介 “网络建设与运维”竞赛共分为以下三个模块&#xff1a; > 网络理论测试&#xff1a; > 网络建设与调试&#xff1b; > 服务搭建与运维。 模块 比赛时长 分值 模块一 网络…

【恋上数据结构】二叉堆学习笔记

二叉堆 需求分析 Top K 问题 什么是 Top K 问题&#xff1f; 从海量数据中找出前 K 个数据。 比如&#xff1a;从 100 万个整数中找出最大的 100 个整数Top K 问题的解法之一&#xff1a;可以用数据结构 “堆” 来解决。 堆 堆是一种【完全二叉树】&#xff0c;可以分为【…

Hadoop学习笔记(HDP)-Part.07 安装MySQL

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

手动创建spring bean并注入

文章目录 前言一、jar包中,相同class不同类加载器加载的时候是同一个class嘛&#xff1f;二、利用ConfigurableListableBeanFactory手动注册bean注册bean,并自动注入依赖bean根据类型获取注入的bean,两个bean是一个吗? 三、同一份字节码,class隔离,bean隔离总结 前言 注入一个…

Linux的IO模型——阻塞IO

当要读数据recvfrom时&#xff0c;其实就需要两个阶段&#xff0c;一是将硬盘数据读到内核缓冲区&#xff0c;二是将内核缓冲区数据拷贝到用户缓冲区。而阻塞IO就是在两个阶段中用户进程都必须阻塞等待。

ES通过抽样agg聚合性能提升3-5倍

一直以来&#xff0c;es的agg聚合分析性能都比较差&#xff08;对应sql的 group by&#xff09;。特别是在超多数据中做聚合&#xff0c;在搜索的条件命中特别多结果的情况下&#xff0c;聚合分析会非常非常的慢。 一个聚合条件&#xff1a;聚合分析请求的时间 search time a…

网页开发 CSS

目录 CSS 概述 CSS 引入方式 CSS 选择器 基本选择器 组合选择器 伪类选择器 样式继承 选择器优先级 CSS 属性操作 文本属性 背景属性 边框属性 列表属性 dispaly属性 盒子模型&#xff08;重点&#xff09; float属性&#xff08;重点&#xff09; CSS 概述 C…

基于go文件同步工具的升级迭代

介绍 同样&#xff0c;该工具适用于多个项目不同版本的维护&#xff0c;文件更新和新增的同步(自动创建目录)&#xff0c;支持自动提交svn。 升级迭代 之前的文件同步工具&#xff0c;依赖chrome和http包&#xff0c;有时候js加载页面不太稳定&#xff0c;所以有空闲就升级迭…

leetcode115.从中序与后序遍历序列构造二叉树,手把手带你构造二叉树(新手向)

构造二叉树是树问题中的难点&#xff08;相对于遍历二叉树&#xff09;&#xff0c;一开始做的读者会感觉无从下手&#xff0c;这道题在训练营专栏里讲过&#xff0c;是四道题一起讲的&#xff0c;但是现在看来讲的并不全面、具体&#xff0c;所以想单独出一期再来讲一下如何构…

老师怎样克服公开课的心理恐惧?

公开课是老师进修学习和交流教学经验的必要手段&#xff0c;但是&#xff0c;很多老师在面对公开课时会出现心理恐惧&#xff0c;在讲台上发挥不自如&#xff0c;影响教学效果。下面就是一些克服公开课心理恐惧的方法&#xff1a; 一、充分准备 准备充分是心理恐惧的最好解决方…

2023.12.4 关于 Spring Boot 统一异常处理

目录 引言 统一异常处理 异常全部监测 引言 将异常处理逻辑集中到一个地方&#xff0c;可以避免在每个控制器或业务逻辑中都编写相似的异常处理代码&#xff0c;这降低了代码的冗余&#xff0c;提高了代码的可维护性统一的异常处理使得调试和维护变得更加容易&#xff0c;通…

deepflow本地部署过程

本地服务器配置&#xff0c;32C&#xff0c;48G内存 整个过程需要配置k8s&#xff0c;安装helm, 安装grafana, 安装deepflow以及deepflow-ctl&#xff0c;以及部署demo 在采用sealos进行ALL-IN-ONE部署之前&#xff0c; grafana 先安装它 wget -q -O /usr/share/keyrings/gr…

VSCode + gdb + gdbserver调试ARM程序

在开发ARM嵌入式端C/C程序时&#xff0c;一般会在PC上编写代码&#xff0c;在Linux服务器上编译&#xff0c;然后将程序复制或挂载到ARM开发板上运行。如果程序出了问题&#xff0c;在不使用gdb的情况下&#xff0c;经常在代码中添加打印&#xff0c;编译&#xff0c;然后在开发…

nodejs+vue+ElementUi小区社区公寓宿舍智能访客预约系统

该系统将采用B/S结构模式&#xff0c;前端部分主要使用html、css、JavaScript等技术&#xff0c;使用Vue和ElementUI框架搭建前端页面&#xff0c;后端部分将使用Nodejs来搭建服务器&#xff0c;并使用MySQL建立后台数据系统&#xff0c;通过axios完成前后端的交互&#xff0c;…