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

uni-app低成本封装一个取色器组件

在uni-ui中找不到对应的工具

后面想想也是 移动端取色干什么?
没办法 也挂不住特殊需求

因为去应用市场下载 这总东西 又不是很有必要

那么 下面这个组件或许能解决您的烦恼

<template>
	<view class="content">
		<view class="dialog">
			<view id="colorBg" class="colorBg" @touchstart="startTouch" @touchmove="moveIng"
				@touchend="endTouch">
				<view class="roundBuff" :catchtouchmove="true" @c.stop="()=>{}" :style="'transform:rotate(' +degrees +'deg)'"></view>
				<view class="colorPan" :style="'color:'+getColorByDeg(this.degrees)">拖转轮播取色</view>
			</view>
			<view class="flex" style="margin-top: 100rpx;">
				<button class="lee_btn" @click.stop = "close" type="default">取消</button>
				<button class="lee_btn" @click.stop = "readColor" type="default">确认</button>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				pointerShow: true,
				colorPanWidth: 20,
				colorPanRadius: 0,
				pointerBox: {},
				degrees: 0
			}
		},
		mounted() {
			uni.getSystemInfo({
				success: (res) => {
					uni.createSelectorQuery().select('#colorBg').boundingClientRect((rect) => {
						this.pointerBox = rect
					}).exec()
					this.colorPanRadius = res.screenWidth * 0.4
				}
			})
		},
		methods: {
			close(){
                this.$emit('close');
			},
			readColor(){
				let colro = this.getColorByDeg(this.degrees);
				this.$emit('change',colro);
			},
            rbg2Hex(r, g, b) {
                return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
            },
            calculationScheme(deg) {
              deg = 360- deg + 120
		      const r = Math.round(Math.sin((deg * 2 * Math.PI) / 360) * 255)
		      const g = Math.round(Math.sin(((deg + 120) * 2 * Math.PI) / 360) * 255)
		      const b = Math.round(Math.sin(((deg + 240) * 2 * Math.PI) / 360) * 255)
              return this.colorRgbToHex(`rgb(${r},${g},${b})`);
            },
			startTouch(e) {
				const {
					pageX,
					pageY
				} = e.touches[0]
				this.rotatePointer(pageX, pageY)
			},
			endTouch(e) {
				const {
					pageX,
					pageY
				} = e.changedTouches[0]
				this.rotatePointer(pageX, pageY)
			},
			moveIng(e) {
				const {
					pageX,
					pageY
				} = e.touches[0]
				this.rotatePointer(pageX, pageY)
			},
			rotatePointer(pageX = 0, pageY = 0) {
				const {
					pointerBox,
					colorPanWidth
				} = this
				const mouseX = pageX - colorPanWidth
				const mouseY = pageY - colorPanWidth
				var centerY = pointerBox.top + (pointerBox.height / 2) - 0,
					centerX = pointerBox.left + (pointerBox.height / 2) - 0,
					radians = Math.atan2(mouseX - centerX, mouseY - centerY)
				this.degrees = (radians * (180 / Math.PI) * -1) + 180;
			},
		     getColorByDeg(deg) {
		      deg = 360- deg + 120
		      const r = Math.round(Math.sin((deg * 2 * Math.PI) / 360) * 255)
		      const g = Math.round(Math.sin(((deg + 120) * 2 * Math.PI) / 360) * 255)
		      const b = Math.round(Math.sin(((deg + 240) * 2 * Math.PI) / 360) * 255)
		      return `rgb(${r},${g},${b})`
		    },
			colorRgbToHex(rgbStr) {
				const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8}|[0-9a-fA-f]{6}[0-9]{2})$/;
				if (reg.test(rgbStr)) {
					return rgbStr
				} else {
					const rgbArray = rgbStr.replace(/(?:\(|\)|rgba|rgb|RGBA|RGB)*/g, "").split(",");
					let strHex = "#";
					for (let i = 0; i < rgbArray.length; i++) {
					if (i !== 3) {
						if (rgbArray[i] == "0") {
						    strHex += "00"
						} else {
						    let newItem =Number(rgbArray[i]).toString(16)
						if (newItem.length < 2){
							newItem = "0" + newItem
						}
						    strHex += newItem
						}
							} else {
						strHex += rgbArray[i] == "0" ? "" : Number(rgbArray[i]) * 100
					}
					}
					return strHex;
				}
			}
		}
	}
</script>

<style>


	.dialog {
		display: block;
		border-radius: 30rpx;
		background-color: #303030;
		margin: 20rpx;
		padding: 30rpx;
	}

	.flex {
		display: flex;
		justify-content: space-between;
	}

	.colorBg {
		width: 80vw;
		height: 80vw;
		margin: 5vw;
		background: conic-gradient(red,
				yellow,
				lime,
				aqua,
				blue,
				fuchsia,
				red);
		border-radius: 50%;
		position: relative;
		display: flex;
		justify-content: center;
		align-items: center;
	}

	.roundBuff {
		width: 55vw;
		height: 55vw;
		-webkit-transform-origin: center 50%;
		transform-origin: center 50%;
		background: #303030;
		border-radius: 50%;
	}
	.roundBuff::before {
      content: "";
      width: 15px;
      height: 15px;
	  background: #303030;
      border: solid #303030;
      border-width: 10px 10px 0 0;
      transform: translate(-50%, -50%) rotate(-45deg);
      position: absolute;
      left: 50%;
      top: 2%;
}

	.lee_btn {
		background: #00000000;
		color: #FFFFFF;
		width: 36%;
		height: 80rpx;
		line-height: 70rpx;
		text-align: center;
		justify-content: center;
		font-size: 30rpx;
		border-radius: 50rpx;
		border: 5rpx #FFFFFF solid;
		font-weight: bold;
		padding: 1px 20px;
	}

	.colorPan {
		position: absolute;
		color: #FFFFFF;
	}
</style>

直接将整个组件复制过去 接口使用
在这里插入图片描述
组件有两个方法
change 当你点击确定时触发 返回 RGB 色码
close 当你点击取消时触发
在这里插入图片描述

相关文章:

  • 大学物理·第15章【量子物理】
  • Linux 磁盘坏块修复处理(错误:read error: Input/output error)
  • 常见字符串函数的使用,你确定不进来看看吗?
  • 【Linux】进程优先级 | 进程的切换 | 环境变量详解
  • 软件测试标准流程
  • 将群晖NAS变为本地盘
  • 网络安全的就业及发展前景如何?
  • Hadoop组件Yarn常见命令
  • 2022年这5款熟悉的软件退出了历史舞台
  • 工程项目管理系统源码+spring cloud 系统管理+java 系统设置+二次开发
  • 修改Vue项目运行的IP和端口
  • 【笔记】移动端自动化:adb调试工具+appium+UIAutomatorViewer
  • 【C→C++】打开C++世界的大门
  • 程序环境--翻译+执行
  • Node=>Express中间件 学习3
  • [LeetCode] Wiggle Sort
  • Android系统模拟器绘制实现概述
  • DOM的那些事
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 闭包,sync使用细节
  • 程序员最讨厌的9句话,你可有补充?
  • 关于Flux,Vuex,Redux的思考
  • 排序算法之--选择排序
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 思维导图—你不知道的JavaScript中卷
  • 小而合理的前端理论:rscss和rsjs
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​渐进式Web应用PWA的未来
  • #ifdef 的技巧用法
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • $().each和$.each的区别
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (4)STL算法之比较
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (二)hibernate配置管理
  • (二)PySpark3:SparkSQL编程
  • (七)理解angular中的module和injector,即依赖注入
  • (循环依赖问题)学习spring的第九天
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .Net 高效开发之不可错过的实用工具
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • //解决validator验证插件多个name相同只验证第一的问题
  • ??myeclipse+tomcat
  • @AliasFor注解
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @staticmethod和@classmethod的作用与区别
  • [100天算法】-实现 strStr()(day 52)
  • [DL]深度学习_Feature Pyramid Network
  • [hdu 1247]Hat’s Words [Trie 图]
  • [HDU5685]Problem A