143 lines
5.2 KiB
JavaScript
143 lines
5.2 KiB
JavaScript
|
|
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
|
|
|
|
/**
|
|
* AUTO-GENERATED FILE. DO NOT MODIFY.
|
|
*/
|
|
|
|
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
import { keys, filter, each, isArray, indexOf } from 'zrender/lib/core/util.js';
|
|
import { ELEMENT_ANIMATABLE_PROPS } from './customGraphicTransition.js';
|
|
import { getAnimationConfig } from './basicTransition.js';
|
|
import { warn } from '../util/log.js';
|
|
import { makeInner } from '../util/model.js';
|
|
var getStateToRestore = makeInner();
|
|
var KEYFRAME_EXCLUDE_KEYS = ['percent', 'easing', 'shape', 'style', 'extra'];
|
|
/**
|
|
* Stop previous keyframe animation and restore the attributes.
|
|
* Avoid new keyframe animation starts with wrong internal state when the percent: 0 is not set.
|
|
*/
|
|
export function stopPreviousKeyframeAnimationAndRestore(el) {
|
|
// Stop previous keyframe animation.
|
|
el.stopAnimation('keyframe');
|
|
// Restore
|
|
el.attr(getStateToRestore(el));
|
|
}
|
|
export function applyKeyframeAnimation(el, animationOpts, animatableModel) {
|
|
if (!animatableModel.isAnimationEnabled() || !animationOpts) {
|
|
return;
|
|
}
|
|
if (isArray(animationOpts)) {
|
|
each(animationOpts, function (singleAnimationOpts) {
|
|
applyKeyframeAnimation(el, singleAnimationOpts, animatableModel);
|
|
});
|
|
return;
|
|
}
|
|
var keyframes = animationOpts.keyframes;
|
|
var duration = animationOpts.duration;
|
|
if (animatableModel && duration == null) {
|
|
// Default to use duration of config.
|
|
// NOTE: animation config from payload will be ignored because they are mainly for transitions.
|
|
var config = getAnimationConfig('enter', animatableModel, 0);
|
|
duration = config && config.duration;
|
|
}
|
|
if (!keyframes || !duration) {
|
|
return;
|
|
}
|
|
var stateToRestore = getStateToRestore(el);
|
|
each(ELEMENT_ANIMATABLE_PROPS, function (targetPropName) {
|
|
if (targetPropName && !el[targetPropName]) {
|
|
return;
|
|
}
|
|
var animator;
|
|
var endFrameIsSet = false;
|
|
// Sort keyframes by percent.
|
|
keyframes.sort(function (a, b) {
|
|
return a.percent - b.percent;
|
|
});
|
|
each(keyframes, function (kf) {
|
|
// Stop current animation.
|
|
var animators = el.animators;
|
|
var kfValues = targetPropName ? kf[targetPropName] : kf;
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (kf.percent >= 1) {
|
|
endFrameIsSet = true;
|
|
}
|
|
}
|
|
if (!kfValues) {
|
|
return;
|
|
}
|
|
var propKeys = keys(kfValues);
|
|
if (!targetPropName) {
|
|
// PENDING performance?
|
|
propKeys = filter(propKeys, function (key) {
|
|
return indexOf(KEYFRAME_EXCLUDE_KEYS, key) < 0;
|
|
});
|
|
}
|
|
if (!propKeys.length) {
|
|
return;
|
|
}
|
|
if (!animator) {
|
|
animator = el.animate(targetPropName, animationOpts.loop, true);
|
|
animator.scope = 'keyframe';
|
|
}
|
|
for (var i = 0; i < animators.length; i++) {
|
|
// Stop all other animation that is not keyframe.
|
|
if (animators[i] !== animator && animators[i].targetName === animator.targetName) {
|
|
animators[i].stopTracks(propKeys);
|
|
}
|
|
}
|
|
targetPropName && (stateToRestore[targetPropName] = stateToRestore[targetPropName] || {});
|
|
var savedTarget = targetPropName ? stateToRestore[targetPropName] : stateToRestore;
|
|
each(propKeys, function (key) {
|
|
// Save original value.
|
|
savedTarget[key] = ((targetPropName ? el[targetPropName] : el) || {})[key];
|
|
});
|
|
animator.whenWithKeys(duration * kf.percent, kfValues, propKeys, kf.easing);
|
|
});
|
|
if (!animator) {
|
|
return;
|
|
}
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
if (!endFrameIsSet) {
|
|
warn('End frame with percent: 1 is missing in the keyframeAnimation.', true);
|
|
}
|
|
}
|
|
animator.delay(animationOpts.delay || 0).duration(duration).start(animationOpts.easing);
|
|
});
|
|
} |