IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 在uni-App(Vue)中使用 SVG + JS 自定义动画:模拟关键帧 -> 正文阅读

[游戏开发]在uni-App(Vue)中使用 SVG + JS 自定义动画:模拟关键帧

问题

为什么要使用SVG来制作动画?

SVG是矢量图形,放大不会失真,而且动画看起来很丝滑,能够实现很多平面动画效果,这点是CSS动画比不上的

在Vue中使用SVG有哪些难点?

  • 注意载入顺序,应该在mounted() 过程中载入动画,并且记得 在destroyed() 过程之后销毁。
  • 注意SVG内的锚点定位问题,将你所需的图形放在合适的位置上,并保证屏幕尺寸改变时不会影响到内部的位置。

示例

在此案例中,我需要制作一个Loading 图标,并在不同的页面中显示,当网络发起请求后,loading 变量会控制此图标的显示与隐藏,为此,我制作了一个可复用的组件来实现此目的:

上传的gif因压缩原因看起来比较卡顿,实际上是非常丝滑的
请添加图片描述
代码中有我自创的实现关键帧的方式,每隔10ms 计算一次svg内图形的各项属性,并赋值,10ms一帧已经超过动画视觉标准了,如果想减轻设备负载,可以适当调高一点,如果想榨干设备性能,就调快一点。

<template>
	<view>
		<svg height="100%" width="100%" viewBox="-20.654044750430295 -21.996557659208264 1241.3080895008607 1243.9931153184166" x="0" y="0" id="document" class="disable-on-play" fill="transparent">
		    <g id="elements" style="isolation: isolate;">
		        <defs id="dynamic-definitions">
		            <linearGradient id="ellipse-q79an5euegn--stroke" x1="0" y1="0.5" x2="1" y2="0.5" spreadMethod="pad" gradientUnits="objectBoundingBox">
		                <stop id="ellipse-q79an5euegn--stroke-stop-0" offset="0" stop-color="rgb(0,163,255)"></stop>
		                <stop id="ellipse-q79an5euegn--stroke-stop-1" offset="1" stop-color="rgb(0,52,232)"></stop>
		            </linearGradient>
		            <linearGradient id="ellipse-51gfnuexh6c--fill" x1="0" y1="0.5" x2="1" y2="0.5" spreadMethod="pad" gradientUnits="objectBoundingBox">
		                <stop id="ellipse-51gfnuexh6c--fill-stop-0" offset="0" stop-color="rgb(0,163,255)"></stop>
		                <stop id="ellipse-51gfnuexh6c--fill-stop-1" offset="1" stop-color="rgb(0,52,232)"></stop>
		            </linearGradient>
		            <linearGradient id="ellipse-th8rfzjaes--fill" x1="0" y1="0.5" x2="1" y2="0.5" spreadMethod="pad" gradientUnits="objectBoundingBox">
		                <stop id="ellipse-th8rfzjaes--fill-stop-0" offset="0" stop-color="rgb(0,163,255)"></stop>
		                <stop id="ellipse-th8rfzjaes--fill-stop-1" offset="1" stop-color="rgb(0,52,232)"></stop>
		            </linearGradient>
		        </defs>
		        <defs id="definitions"></defs>
		        <g id="elements-wrapper" width="1200" height="1200">
		            <ellipse ref="outter" id="ellipse-q79an5euegn" rx="500" ry="500" transform="matrix(0 -1 1 0 600 600)" 
					fill="none" stroke="url(#ellipse-q79an5euegn--stroke)" stroke-width="100" 
					stroke-linecap="round" :stroke-dasharray="d1 + ' ' + d2" 
					style="mix-blend-mode: normal; paint-order: fill;" 
					:stroke-dashoffset="strokeDashoffset"></ellipse>
		            <ellipse ref="inner" id="ellipse-51gfnuexh6c" rx="928.571429" ry="928.571429" 
					:transform="'matrix(' + sH + ' 0 0 ' + sW + ' 600 600)'" fill="url(#ellipse-51gfnuexh6c--fill)" 
					stroke="none" stroke-width="15" style="mix-blend-mode: normal; paint-order: fill;"></ellipse>
		        </g>
		    </g>
		    <path d="M-20.654044750430295 -21.996557659208264 h1241.3080895008607 v1243.9931153184166 h-1241.3080895008607 z M0 0 h1200 v1200 h-1200 z" fill-rule="evenodd" id="overlay"></path>    <!---->    <!---->
		    <g id="tool-selection">
		        <g></g>
		        <g>            <!---->            <!----></g>        <!----></g>
		</svg>
	</view>
</template>

<script>
	export default {
		name:"ts-loading",
		data() {
			return {
				d1:0,
				d2:3600,
				strokeDashoffset:0,
				sH:0,
				sW:0,
				timer:null,
			};
		},
		computed:{
			
		},
		mounted() {
			this.addInterval()
		},
		onShow() {
			
		},
		destroyed() {
			clearInterval(this.timer)
			this.timer = null
		},
		methods:{
			addInterval(){
				const that = this
				var t = 0; // 时间
				var et = 2000; //持续时间
				var keyframes = [0,1000,2000]
				var scaleFrames = [0,0.35,0]
				var stockeOffestFrames = [0,0,-3600]
				var stockDashes1Frames = [0,3600,3600]
				var stockDashes2Frames = [3600,3600,3600]
				var targetScale = 0;
				var targetstockeOffest = 0;
				var targetstockDashes1 = 0;
				var targetstockDashes2 = 3600;
				this.timer = setInterval(() =>{
				for (var i = 0; i < keyframes.length; i++) {
					if(t === keyframes[i]){
						targetScale = scaleFrames[i + 1]
						targetstockeOffest = stockeOffestFrames[i + 1]
						targetstockDashes1 = stockDashes1Frames[i + 1]
						targetstockDashes2 = stockDashes2Frames[i + 1]
						break
					}
				}
				that.d1  = that.d1  + (targetstockDashes1 - that.d1 ) / 10
				that.d2 = that.d2 + (targetstockDashes2 - that.d2) / 10
				that.strokeDashoffset = that.strokeDashoffset + (targetstockeOffest - that.strokeDashoffset) / 10
				that.sH = that.sH + (targetScale - that.sH) / 10
				that.sW = that.sW + (targetScale - that.sW) / 10
				t += 10
				if(t >= et){
					t = 0;
					that.d1 = 0
					that.d2 = 3600
					that.strokeDashoffset = 0
					that.sH = 0
					that.sW = 0
					
				}
			},10)
			}
		}
	}
</script>

<style>
	.outter{
		stroke-width: 15;
		transform-origin: center;
		transform: rotateZ(-90deg);
		stroke: linear-gradient(to right,#00a3ff,#0034e8) 1 10;
	}
	.inner{
		transform-origin: center;
		background-color:  linear-gradient(to right,#00a3ff,#0034e8) 1 10;
	}
</style>

调用方式:

<view style="text-align: center;width: 100%" v-show="loading">
	<ts-loading style="margin: auto;" class="main-loading" ></ts-loading>
</view>
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 18:15:32  更:2022-04-18 18:19:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 14:51:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码