uniapp小程序实现圆环效果

这篇具有很好参考价值的文章主要介绍了uniapp小程序实现圆环效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


uniapp小程序利用 canvas2d实现根据指定时间动态画圆环效果
uniapp小程序登录页面代码 携带同意圆圈特效,小程序,uni-app,小程序,javascript

调用

<view class="dubbing-control" :style="{'width':recordWidth,'height':recordWidth}">
	<dubbing-button v-if="show" :width.sync="recordWidth" :size='71' ref="record" @startRecord="onClickHandle" @stopRecord="onClickHandle" :duration="recordConfig.duration"></dubbing-button>
	<image v-else :style="{'width':'142rpx','height':'142rpx','opacity':'0.4'}" src="../static/xgn/record_img.png"></image>
</view>
<script>
export default {
	data() {
		return {
		show:true,//是否展示录制组件
		recordWidth:'88px',//录制按钮+圆环的宽度  动态设置包裹层大小
		recording:'start',//控制是否录制 start:开始 proceed:进行中 end:结束
		}
	}methods:{
	onClickHandle(recording){
		this.recording = recording;
		if (Object.is(this.recording, 'proceed')) {
			//开始渲染圆环
				this.$refs.record.startRecord();
				this.recording = 'proceed';
			} else {
			//停止渲染圆环并重置
				this.recording = 'end';
			}
		}
	}
}
</script>

组件

<template>
	<view class="dubbing-button">
		<view :style="{width: (2*radius+16)+'px', height:(2*radius+16)+'px'}" :class="['record-button',shadowShow ? 'record-button-shadow' : '']  " @touchstart="onClickHandle">
			<canvas class="progress_bg" v-if="Object.is(recording, 'proceed')" type="2d" id="cpbar" canvas-id="cpbar"
				:style="{width: (2*radius+16)+'px', height:(2*radius+16)+'px'}" ></canvas>
			<image v-if="recording=='proceed'" src="../static/xgn/recording_img.gif" :style="{width: 2*radius+'px', height:2*radius+'px'}">
			<image v-else src="../static/xgn/record_img.png" :style="{width: 2*radius+'px', height:2*radius+'px'}">
			</image>
		</view>
		
	</view>

</template>

<script>
	export default {
		name: 'record-button',
		data() {
			return {
				radius: 0, // 半径
				eAngle: 0, // 结束角度
				interval: null,
				deviceWidth: 0,
				recording: 'start',
				canvasContext: null,
				shadowShow: false,
			};
		},
		props: {
			// 进度条转一圈的时间
			duration: {
				type: Number,
				default () {
					return 20000;
				}
			},
			size: { //图片大小
				type: Number,
				default () {
					return 44;
				}
			},
			width:{ //父元素动态设置包裹层的宽高
				type:String,
				default:''
			},
		},
		created() {
			const res = uni.getSystemInfoSync();
			this.deviceWidth = res.windowWidth;
			this.radius = this.getPointValue(this.size);
			this.width =(2*this.radius+16)+'px'; //给父元素设置宽高
			this.$emit('update:width',this.width)
		},
		mounted() {
			// this.canvasContext = uni.createCanvasContext('cpbar', this);
		},
		methods: {
			// 点击录音处理
			async onClickHandle() {
				console.log('button this.recording',this.recording);
				if (!Object.is(this.recording, 'proceed')) {
					this.shadowShow = true;
				} 
				if (Object.is(this.recording, 'proceed')) {
					//如果是录制中 点击则停止
					this.shadowShow = false;
					this.stopRecord();
				} else {
					//否则开始录制 触发父元素录制功能
					if(this.shadowShow){
					this.$emit('startRecord', 'proceed');
					}
				}
			},
			// 开始录音状态
			startRecord() {
				console.log('开始了')
				this.recording = 'proceed';
				let that = this;
				this.shadowShow = false;
				this.drawCircle();
			},
			// 停止录音状态
			stopRecord(status) {
				status ? this.recording = 'start' : this.recording = 'end';
				let that = this;
				this.$emit('stopRecord', 'end');
				clearTimeout(that.interval);
				this.interval = null;
				this.canvasContext && this.clearCicle();
				this.eAngle = 0;
			},
			// 动态绘制圆环
			drawCircle: function() {
				this.$nextTick(()=>{
					const query = uni.createSelectorQuery().in(this);
					query.select('#cpbar').fields({
						node: true,
						size: true
					}).exec(res => {
						console.log('res',res);
						if(res){
							const canvas = res[0].node;
							const ctx = canvas.getContext("2d");
							const dpr = wx.getSystemInfoSync().pixelRatio;
							canvas.width = res[0].width * dpr;
							canvas.height = res[0].height * dpr;
							ctx.scale(dpr, dpr);
							this.canvasContext = ctx;
							this.drawCircleAction();
						}
					})
				})
			},
			drawCircleAction(){
				this.eAngle += 2 * Math.PI / (this.duration / 100);
				this.canvasContext.lineWidth = 4;
				this.canvasContext.strokeStyle = '#FE9B2F';
				this.canvasContext.lineCap = 'butt';
				this.canvasContext.beginPath();
				// arc(x,y,半径,起始弧度,结束弧度,顺逆时针)
				this.canvasContext.arc(this.radius + 8, this.radius + 8, this.radius + 4, 0, this.eAngle , false);
				this.canvasContext.stroke();
				this.canvasContext.closePath();
				if (this.eAngle >= 2 * Math.PI) {
					this.stopRecord();
				} else {
					let that = this;
					clearTimeout(that.interval);
					this.interval = setTimeout(that.drawCircleAction, 100);
				}
			},
			// 清空圆环
			clearCicle() {
				this.canvasContext.clearRect(0, 0, 2 * this.radius + 16, 2 * this.radius + 16);
			},
			// canvas适配不同机型 算出当前屏幕中实际px大小
			getPointValue(val) {
				return Math.floor(val * this.deviceWidth / 750);
			},
		},
		destroyed() {
			this.stopRecord();
		}
	}
</script>

<style lang="scss" scoped>
	.record-button {
		position: relative;
		image {
			position: absolute;
			left: 50%;
			top: 50%;
			transform: translate(-50%,-50%);
		}

		.progress_bg {
			position: absolute;
			top: 0;
			left: 0;
			z-index: 1;
			transform: rotate(-90deg);
		}
	}
	.record-button-shadow{
		image {
			opacity: 0.4;
		}
	}
	.popup_wrap {
		width: 594rpx;
		border-radius: 20rpx;
		background: #fff;
		box-sizing: border-box;
		padding-top: 48rpx;
		display: flex;
		flex-direction: column;
		box-sizing: border-box;
		box-shadow: 0rpx 6rpx 20rpx 0rpx rgba(255, 214, 170, 0.9);

		.popup_title {
			font-size: 34rpx;
			font-weight: 500;
			color: #283445;
			text-align: center;
			margin-bottom: 48rpx;
			padding: 0 20rpx;
			box-sizing: border-box;
		}

		.popup_footer {
			height: 88rpx;
			width: 100%;
			display: flex;
			align-items: center;
			justify-content: center;
			padding: 0 20rpx;
			box-sizing: border-box;

			view {
				flex: 1;
				border-top: 2rpx solid #dcdcdc;
				text-align: center;
				font-size: 32rpx;
				padding: 22rpx 0;
				box-sizing: border-box;

				text {
					display: block;
					height: 50rpx;
				}
			}

			view.popup_footer_confirm {
				color: #283445;

				text {
					border-left: 2rpx solid #dcdcdc;
				}
			}

			view.popup_footer_cancel {
				color: #7e94b1;
			}
		}
	}
</style>

文章来源地址https://www.toymoban.com/news/detail-522710.html

到了这里,关于uniapp小程序实现圆环效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Echarts折线图交点呈现为圆点加圆环的效果实现

    series中的symbolSize设置圆点大小,itemStyle中的color设置圆点颜色,外圆环使用边框属性实现即borderWidth、borderColor: 效果:

    2024年02月12日
    浏览(56)
  • uniapp获取用户信息(登录及个人中心页面的实现)

    因为在微信小程序中wx.getuserInfo已经失效,所以我们在uniapp中也应该使用wx.getUserProfile来获取用户信息 页面的逻辑 一上来加载个人中心页,当用户点击未登录三个字时跳转登录页 登录页点击微信登录应该跳出授权弹窗获取用户的授权信息(使用wx.getUserProfile) 当用户点击同意

    2024年02月11日
    浏览(52)
  • 微信小程序登录注册页面代码

    以下是一个简单的微信小程序注册登录页面的代码示例: 上面代码中,index.wxml 文件定义了注册页面的视图,包括用户名、密码、确认密码的输入框以及提交按钮和一个跳转到登录页面的链接。index.js 文件定义了注册页面的逻辑,当用户点击提交按钮时会发送注册请求,并根

    2024年02月11日
    浏览(48)
  • 微信camera拍照组件的使用(uniapp小程序)代码可直接复制看效果

    微信camera官方文档:https://developers.weixin.qq.com/miniprogram/dev/component/camera.html html 整体效果 样式可以自行定义的一个拍照组件 未找到摄像头是因为台式机电脑没有摄像头 真机测试可以使用 2)方法 cameraError方法进入拍照页面时会提醒授权相机。如果用户点击不同意授权就会打回上

    2024年02月16日
    浏览(36)
  • 微信小程序携带参数的页面跳转

    日常我们在手机app购物的时候,点击app主页琳琅满目的商品,就会跳转到商品的具体页面。 无论我们点击哪个商品,跳转到商品具体页面的布局都是一样的,但页面内的数据不一样,比如说商品名称,图片等等不一样。这就是在点击商品的时候,在跳转到具体页面时候传递了

    2024年02月09日
    浏览(67)
  • uniapp小程序中的登录完整代码(兼容小程序和app)

            伴随着互联网的快速发展,移动端应用领域也发生了翻天覆地的变化,随之而来的是各式各样的APP应用程序、轻应用、小程序等项目产品,人们的移动生活也变得更加丰富多彩!本文旨在帮助快速构建uniapp登录页面,仅提供参考价值。喜欢帮忙一键三联,谢谢!

    2024年02月04日
    浏览(75)
  • 【微信小程序】实现页面tab切换效果

    目录 前言 本次效果展示 一、如何实现页面tab 1.使用内置组件scroll-view 2.实现点击时出现的背景样式 3.使用scroll-into-view,实现点击时自动滚动 本次主要内容是介绍页面tab的开发,如何实现tab与页面内容联动呢?关注我就知道!   如下图所示,我们需要使用到红色框框中的属

    2024年02月09日
    浏览(94)
  • 前端 | VScode实现一边写代码一边可以实时查看页面效果[图文详解]

    本文主要是基于VSCode实现实现一边写前端代码一边可以实时查看页面效果。 自从VScode更新后,不用自己另外设置浏览器的打开方式,只需要俩个插件就可以简单搞定: - Live Server - Live Preview  当然也可以下载别的浏览器 点击代码,右键选择 Show Preview ,就会实现左边代码,右边

    2024年02月08日
    浏览(34)
  • uniapp小程序利用transition实现吸顶效果

     需要利用scroll-view监听页面滚动距离(注意,需要添加:throttle=\\\"false\\\"关闭内置的节流阀) scrollTop监听页面滚动变化 然后利用官网的transition组件实现吸顶效果(选用淡入淡出) (zero-custom-bar、v-tab是第三方插件库,可以去插件市场搜索。Topbar是我自己封装的一个自定义组件,可以

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包