android svg路径动画,svg实现自定义路径动画

layout: post

title: "svg自定义路径动画"

subtitle: "svg path 动画"

date: 2016-09-26 12:00:00

author: "Guolei"

header-img: ""

header-mask: 0.3

catalog: false

tags:

- svg

svg相对于canves,svg更加适合做小图标和线条,canves做大型游戏

svg的基础教程可以在w3c上查看,本篇文章主要讲,如何绘制自定义路径,以及如何在自定义路径上实现动画。

先看效果

394d8955eed5

(忽略我丑陋的书法)

394d8955eed5

难点:

如何将自定义路径转化为Path代码

如何获取svn每个像素点的坐标

车子并不是简单的位移,车头方向和前进方向相同(切线)

原理

svg实现动画一般是通过 stroke-dasharray和stroke-dashoffset这两个属性来实现。

backgroundLayer 1

html

path {

stroke-dasharray: 3000;

stroke-dashoffset: 3000;

-webkit-animation: dash 5s linear infinite;

animation: dash 5s linear infinite;

}

css

stroke-dasharray代表虚线之间的间距大小

stroke-dashoffse代表虚线的偏移量

实现过程

设置一个足够长的间距 (大于路径的长度)

设置一个足够长的偏移量,保证刚开始看不到路径。(可以和长度一样)

让偏移变成0 最后在配合css3的animation 增加一个动画过度,实现动画。

path代码

问题来了,path的代码哪里来的

难道自己一个个像素点去算?

当然不是,我们有工具

394d8955eed5

使用教程:

选择画笔工具

在画板上绘制路线

点击view,导出路径代码

高阶用法

绘制好svn路线之后,如何让物体沿着路径前进

// 配置位移矢量 一共走100步

var STEP = 100;

var curStep = 0;

var path = $('#path')[0];

var $car = $('#car');

var timer = null;

// 最重要的两个属性 获取长度,以及每个点的坐标

var totalLength = path.getTotalLength();

var initPosition = path.getPointAtLength(0);

var prePosition = initPosition;

var curPosition = initPosition;

// 获取前进切线角度

function getRotate(a, b) {

var k = (b.y - a.y) / (b.x - a.x);

var rotate = Math.atan(k) * 180 / Math.PI;

return k < 0 ? rotate + 90 : rotate - 90;

}

// 定位car

$car.css({

left: initPosition.x,

top:initPosition.y,

'-webkit-transform': 'translate(-2px, 0) rotate(' + getRotate(curPosition , path.getPointAtLength(1)) +'deg)'

}).show()

// 定时器控制前进

timer = setInterval(function() {

if (curStep != STEP) {

curStep++;

curPosition = path.getPointAtLength(totalLength/STEP * curStep);

$car.css({

left: curPosition.x,

top:curPosition.y,

'-webkit-transform': 'translate(-2px, 0) rotate('+getRotate(prePosition, curPosition)+'deg)'

}).show();

prePosition = curPosition;

} else {

clearInterval(timer);

}

}, 100)

原理就是将svn的长度平分100次,每100ms走一次,每次的坐标通过 path.getPointAtLength(totalLength/STEP * curStep)计算,然后通过js控制小车的位置。

通过setimeout可以配置小车运动的快慢,还可以通过缓动函数,使小车具有惯性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值