Skip to content

Commit 5fe34b9

Browse files
committed
update ticker
1 parent e611c9b commit 5fe34b9

File tree

8 files changed

+107
-62
lines changed

8 files changed

+107
-62
lines changed

examples/scrollAnim.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,28 @@ import Tween from 'rc-tween-one';
22
import React from 'react';
33
import ReactDom from 'react-dom';
44
import ScrollOverPack from 'rc-scroll-anim/lib/ScrollOverPack';
5-
import { Row, Col } from 'antd';
65

76
function Demo() {
87
return (
98
<div>
109
<div style={{ height: 800 }}>往下滚动</div>
1110
<ScrollOverPack
1211
style={{ height: 800 }}
13-
component={Row}
14-
componentProps={{ gutter: { md: 12, sm: 5 } }}
1512
>
1613
<Tween
1714
key="1"
1815
animation={{ y: 30, type: 'from', ease: 'easeOutQuart', opacity: 0 }}
1916
reverseDelay={200}
2017
style={{ background: '#fff000' }}
21-
component={Col}
18+
>
19+
执行动画
20+
</Tween>
21+
<Tween
22+
key="2"
23+
id="12"
24+
animation={{ y: 30, delay: 100, ease: 'easeOutQuart', type: 'from', opacity: 0, id: 12 }}
25+
reverseDelay={100}
26+
style={{ background: '#000fff' }}
2227
>
2328
执行动画
2429
</Tween>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
placeholder
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import Tween from 'rc-tween-one';
2+
import React from 'react';
3+
import ReactDom from 'react-dom';
4+
import ScrollOverPack from 'rc-scroll-anim/lib/ScrollOverPack';
5+
import { Row, Col } from 'antd';
6+
7+
function Demo() {
8+
return (
9+
<div>
10+
<div style={{ height: 800 }}>往下滚动</div>
11+
<ScrollOverPack
12+
style={{ height: 800 }}
13+
component={Row}
14+
componentProps={{ gutter: { md: 12, sm: 5 } }}
15+
>
16+
<Tween
17+
key="1"
18+
animation={{ y: 30, type: 'from', ease: 'easeOutQuart', opacity: 0 }}
19+
reverseDelay={200}
20+
style={{ background: '#fff000' }}
21+
component={Col}
22+
>
23+
执行动画
24+
</Tween>
25+
</ScrollOverPack>
26+
</div>);
27+
}
28+
29+
ReactDom.render(<Demo />, document.getElementById('__react-content'));

examples/simple.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ class Demo extends React.Component {
1010

1111
render() {
1212
return (<Tween
13-
animation={{ x: 300, duration: 100000 }}
13+
animation={{ x: 300}}
1414
style={{ opacity: 1, height: 100, display: 'inline-block' }}
15+
onChange={this.bbb}
1516
>
1617
<div>执行动效</div>
1718
</Tween>);

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "rc-tween-one",
3-
"version": "2.2.21",
3+
"version": "2.3.0",
44
"description": "tween-one anim component for react",
55
"keywords": [
66
"react",

src/TweenOne.jsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class TweenOne extends Component {
7979
if (typeof nextMoment === 'number' && nextMoment !== this.props.moment) {
8080
if (this.tween && !this.updateAnim) {
8181
this.startMoment = nextMoment;
82-
this.startFrame = ticker.frame;
82+
this.startTime = ticker.time;
8383
if (nextProps.paused) {
8484
this.raf();
8585
}
@@ -176,15 +176,15 @@ class TweenOne extends Component {
176176
setDefalut = (props) => {
177177
this.moment = props.moment || 0;
178178
this.startMoment = props.moment || 0;
179-
this.startFrame = ticker.frame;
179+
this.startTime = ticker.time;
180180
}
181181

182182
restart = () => {
183183
if (!this.tween) {
184184
return;
185185
}
186186
this.startMoment = this.moment;
187-
this.startFrame = ticker.frame;
187+
this.startTime = ticker.time;
188188
this.tween.reverse = this.reverse;
189189
this.tween.reverseStartTime = this.startMoment;
190190
this.raf();
@@ -221,9 +221,9 @@ class TweenOne extends Component {
221221
let { repeat } = this.props;
222222
const totalTime = repeat === -1 ? Number.MAX_VALUE : this.tween.totalTime * (repeat + 1);
223223
repeat = repeat >= 0 ? repeat : Number.MAX_VALUE;
224-
let moment = (ticker.frame - this.startFrame) * perFrame + this.startMoment;
224+
let moment = ticker.time - this.startTime + this.startMoment;
225225
if (this.reverse) {
226-
moment = (this.startMoment || 0) - (ticker.frame - this.startFrame) * perFrame;
226+
moment = (this.startMoment || 0) - (ticker.time - this.startTime);
227227
}
228228
moment = moment > totalTime ? totalTime : moment;
229229
moment = moment <= 0 ? 0 : moment;

src/ticker.js

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ Ticker.prototype = {
1313
perFrame: Math.round(1000 / 60),
1414
elapsed: 0,
1515
lastUpdate: getTime(),
16+
startTime: getTime(),// 开始时间,不计算 react 渲染时间;
17+
nextTime: 0,
18+
time: 0,
1619
};
1720
const p = Ticker.prototype;
1821
p.add = function (fn) {
@@ -40,12 +43,18 @@ p.sleep = function () {
4043
const ticker = new Ticker;
4144
p.tick = function (a) {
4245
ticker.elapsed = getTime() - ticker.lastUpdate;
46+
// 离开当前时设值 300;大于 300 则为离开。
47+
if (ticker.elapsed > 300) {
48+
ticker.startTime += ticker.elapsed - ticker.perFrame;
49+
}
4350
ticker.lastUpdate += ticker.elapsed;
44-
if (!ticker.frame) {
51+
ticker.time = ticker.lastUpdate - ticker.startTime;
52+
const overlap = ticker.time - ticker.nextTime;
53+
if(overlap > 0 || !ticker.frame) {
4554
ticker.frame++;
46-
} else {
47-
ticker.frame += Math.round(ticker.elapsed / ticker.perFrame);
55+
ticker.nextTime += overlap;
4856
}
57+
// console.log(ticker.frame, ticker.nextTime, ticker.time)
4958
ticker.tickFnArray.forEach(func => func(a));
5059
// 如果 object 里没对象了,自动杀掉;
5160
if (!ticker.tickFnArray.length) {
@@ -60,9 +69,9 @@ p.timeout = function (fn, time) {
6069
return console.warn('not function');// eslint-disable-line
6170
}
6271
const timeoutID = `timeout${Date.now()}-${timeoutIdNumber}`;
63-
const startFrame = this.frame;
72+
const startTime = this.time;
6473
this.wake(timeoutID, () => {
65-
const moment = (this.frame - startFrame) * this.perFrame;
74+
const moment = this.time - startTime;
6675
if (moment >= (time || 0)) {
6776
this.clear(timeoutID);
6877
fn();
@@ -78,11 +87,11 @@ p.interval = function (fn, time) {
7887
return null;
7988
}
8089
const intervalID = `interval${Date.now()}-${intervalIdNumber}`;
81-
let starFrame = this.frame;
90+
let starTime = this.time;
8291
this.wake(intervalID, () => {
83-
const moment = (this.frame - starFrame) * this.perFrame;
92+
const moment = this.time - starTime;
8493
if (moment >= (time || 0)) {
85-
starFrame = this.frame;
94+
starTime = this.time;
8695
fn();
8796
}
8897
});

0 commit comments

Comments
 (0)