You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
5.2 KiB
161 lines
5.2 KiB
|
|
/* |
|
* 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); |
|
}); |
|
} |