当前位置: 首页 > news >正文

<uniapp><指针组件>基于uniapp,编写一个自定义箭头指针组件

前言

本专栏是关于uniapp的相关介绍,如果你对uniapp感兴趣,不妨来看看。

环境配置

系统:windows10

平台:HBuilderX4.76

语言:vue、javascript

库:uni

概述

本文是基于uniapp,编写一个自定义组件,一个直线带箭头的指针组件,效果图如下:
在这里插入图片描述

1、组件简介

这个组件的功能就是生成一个带箭头的直线指针,可以设置长度、颜色、角度等参数,内部是使用了svg封装的,之所以要写这样的组件,是因为我为了实现时钟的效果,想着添加时针、秒针这样的元素,而且为了模拟时钟,秒针还需要每秒变化,效果如下:

在这里插入图片描述

所以想着,为了方便调用,将指针单独写成一个组件,这样不仅制作秒针等场景时可以使用,如果有其他场景,需要这样的一个指针,也可以直接调用。

2、组件实现

如上所述,组件内部就是一个svg,分为两部分,直线、箭头。

我们先来看下内部svg的结构:

在这里插入图片描述

1、箭头部分

箭头部分即marker包裹的内容,箭头当然可以是任意形状,但我们此处使用的是比较通用的三角形箭头,箭头包括了图形的长度、宽度、顶点坐标等,如下:

<markerid="arrow":markerWidth="10":markerHeight="10":refX="9":refY="5"orient="auto"><polygon points="0 0,10 5,0 10" fill="#000000"></polygon></marker>

不过,我们可以将这些参数用变量来表示,我们设置三种规格的箭头:small、normal、big,通过属性markerMode来选择:

//根据模式选择marker配置const getMarkerConfig = (mode)=>{const config = {small: { id:'small', markerWidth:6,  markerHeight:6,   refX:5,  refY:3,   },normal:{ id:'normal', markerWidth:10, markerHeight:10,  refX:9,  refY:5,   },big:   { id:'big', markerWidth:15, markerHeight:15,  refX:14,  refY:7.5,},};return config[mode] || config.normal;};const polygonPoints= computed(()=>{if (props.markerMode === 'normal'){return "0 0,10 5,0 10"} else if(props.markerMode === 'small'){return "0 0,6 3,0 6"} else if(props.markerMode == 'big'){return "0 0,15 7.5,0 15"} else{return "0 0,10 5,0 10"}});

如上,我们添加getMarkerConfig函数来根据mode返回不同配置,然后我们使用v-bind绑定它:

<marker v-bind="getMarkerConfig(props.markerMode)"orient="auto"><polygon :points="polygonPoints" fill="#000000" /></marker>

这样,我们调用组件时,只需要设置markerMode即可:

<linePointer:startP="startP":lineDistance="100"lineColor="#55aaff":isDashed="true"markerMode="big"></linePointer>

箭头效果:

在这里插入图片描述

2、直线部分

直线部分用于渲染直线,先看结构:

	<line:x1="xx1":y1="yy1":x2="xx2":y2="yy2":stroke-width="lineWidth":stroke="lineColor":stroke-dasharray="isDashed? '10,5' : 'none'":marker-end="`url(#${props.markerMode})`"></line>

要显示直线,需要知道直线的起点、终点,还需要设置直线的宽度、颜色、是否虚线,marker-end是将箭头添加到直线末端。(也可以在起始端添加箭头,但本组件不使用),双箭头效果:

在这里插入图片描述

我们为组件设置属性:起点坐标、长度,然后来计算终点坐标:

const angle = computed(()=>{if(!props.lineAngle) return 0;return props.lineAngle;});const rad = computed(()=>{return (angle.value * Math.PI) / 180});const distance = computed(()=>{if(!props.lineDistance) return 100;return props.lineDistance});
const xx2 = computed(()=>{return (xx1.value + distance.value * Math.cos(rad.value))});const yy2 = computed(()=>{return (yy1.value + distance.value * Math.sin(rad.value))});

使用计算属性,可以自动响应变化。

看一下演示效果:
在这里插入图片描述


文章转载自:

http://G6B5rJPR.mpyry.cn
http://CviRZECs.mpyry.cn
http://YTKs2pR0.mpyry.cn
http://FwgXTq6C.mpyry.cn
http://hjVIhj3W.mpyry.cn
http://K6ogRYmr.mpyry.cn
http://W0SKnPNg.mpyry.cn
http://Vp8fzcpI.mpyry.cn
http://SSra3xe5.mpyry.cn
http://WGNLK343.mpyry.cn
http://okSVJUyi.mpyry.cn
http://kPDpGTJZ.mpyry.cn
http://YDd4rrVB.mpyry.cn
http://gRZNtFdU.mpyry.cn
http://l0SwDtO2.mpyry.cn
http://tlMSEOMS.mpyry.cn
http://rUgR4Skw.mpyry.cn
http://myme3plX.mpyry.cn
http://GNs8e9Pb.mpyry.cn
http://GEM4XbQB.mpyry.cn
http://YZldUD4m.mpyry.cn
http://YoxLNNhp.mpyry.cn
http://3nIf2HMC.mpyry.cn
http://rdfc1VYL.mpyry.cn
http://0Jlw67QR.mpyry.cn
http://Fmn2z2dh.mpyry.cn
http://UHVyLzrt.mpyry.cn
http://OXhL6XZ8.mpyry.cn
http://gbTu938Q.mpyry.cn
http://oFsMCDn7.mpyry.cn
http://www.dtcms.com/a/376869.html

相关文章:

  • 新手向:中文语言识别的进化之路
  • Jakarta EE 课程 --- 微型资料投递与分发(Mini Drop-off Box)
  • 【船类】监控录像下船舶类别检测识别数据集:近7k图像,6类,yolo标注
  • 《UE5_C++多人TPS完整教程》学习笔记51 ——《P52 使用我们的瞄准偏移(Using Our Aim Offsets)》
  • 腾讯云远程桌面连接不上?5步排查法解决RDP连接失败
  • ffplay播放pcm
  • 计算机毕业设计 基于Hadoop的B站数据分析可视化系统的设计与实现 Python 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
  • 【Halcon 】Halcon 裁剪尺寸的像素陷阱全解析:为什么要 -0.5,为什么要 -1,而圆却不用?
  • 机器视觉质检数据融合PLM:产品缺陷根因分析新范式
  • 【超详细图文教程】2025年最新Win10 系统安装 MySQL 教程
  • 医疗行业面临的网络安全挑战及应对策略
  • JVM CMS垃圾回收器深度解析
  • 鸿蒙Next ArkWeb进程解析:多进程架构如何提升Web体验
  • Credo发布专为低功耗、高带宽与超低时延的AI网络打造的Bluebird 1.6T光DSP芯片
  • Shell 循环语句与函数全解析
  • Zookeeper核心知识全解:节点类型、集群架构与选举机制
  • Android 项目中 Gradle 配置实战:多渠道打包、签名配置、版本管理
  • 新手向:实现验证码程序
  • 【小程序】微信小程序隐私协议
  • LeetCode 刷题【71. 简化路径】
  • 【LeetCode 每日一题】1493. 删掉一个元素以后全为 1 的最长子数组——(解法一)预处理
  • Java代理模式详解
  • 【论文阅读】MEDDINOV3:如何调整视觉基础模型用于医学图像分割?
  • 超声波探伤的所用到的频段?
  • 关于ping不通,如何排查?
  • const allImages = { ...leftCategoryImages, ...rightCategoryImages }; 是是什么用法
  • 论文阅读:arxiv 2023 Large Language Models are Not Stable Recommender Systems
  • Transformer系列 | Pytorch复现Transformer
  • 神经网络常见层速查表
  • 算法练习——55.跳跃游戏