mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-19 11:41:20 +08:00
118 lines
4.5 KiB
JavaScript
118 lines
4.5 KiB
JavaScript
// Copyright 2014 Google Inc. All rights reserved.
|
|
//
|
|
// Licensed 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.
|
|
|
|
(function(shared, scope, testing) {
|
|
|
|
scope.convertEffectInput = function(effectInput) {
|
|
var keyframes = shared.normalizeKeyframes(effectInput);
|
|
var propertySpecificKeyframeGroups = makePropertySpecificKeyframeGroups(keyframes);
|
|
var interpolations = makeInterpolations(propertySpecificKeyframeGroups);
|
|
return function(target, fraction) {
|
|
if (fraction != null) {
|
|
interpolations.filter(function(interpolation) {
|
|
return (fraction <= 0 && interpolation.startTime == 0) ||
|
|
(fraction >= 1 && interpolation.endTime == 1) ||
|
|
(fraction >= interpolation.startTime && fraction <= interpolation.endTime);
|
|
}).forEach(function(interpolation) {
|
|
var offsetFraction = fraction - interpolation.startTime;
|
|
var localDuration = interpolation.endTime - interpolation.startTime;
|
|
var scaledLocalTime = localDuration == 0 ? 0 : interpolation.easing(offsetFraction / localDuration);
|
|
scope.apply(target, interpolation.property, interpolation.interpolation(scaledLocalTime));
|
|
});
|
|
} else {
|
|
|
|
// IONIC HACK!
|
|
// DO NOT CLEAR OUT THE INLINE STYLE HERE
|
|
// IONIC ANIMATE SETS INLINE STYLES ITSELF AND THE WEB ANIMATIONS API WILL
|
|
// OVERWRITE IONIC DUE TO THE ASYNC PROMISES THAT FIRE OFF AFTER ONFINISH
|
|
|
|
// for (var property in propertySpecificKeyframeGroups)
|
|
// if (property != 'offset' && property != 'easing' && property != 'composite')
|
|
// scope.clear(target, property);
|
|
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
function makePropertySpecificKeyframeGroups(keyframes) {
|
|
var propertySpecificKeyframeGroups = {};
|
|
|
|
for (var i = 0; i < keyframes.length; i++) {
|
|
for (var member in keyframes[i]) {
|
|
if (member != 'offset' && member != 'easing' && member != 'composite') {
|
|
var propertySpecificKeyframe = {
|
|
offset: keyframes[i].offset,
|
|
easing: keyframes[i].easing,
|
|
value: keyframes[i][member]
|
|
};
|
|
propertySpecificKeyframeGroups[member] = propertySpecificKeyframeGroups[member] || [];
|
|
propertySpecificKeyframeGroups[member].push(propertySpecificKeyframe);
|
|
}
|
|
}
|
|
}
|
|
|
|
for (var groupName in propertySpecificKeyframeGroups) {
|
|
var group = propertySpecificKeyframeGroups[groupName];
|
|
if (group[0].offset != 0 || group[group.length - 1].offset != 1) {
|
|
throw {
|
|
type: DOMException.NOT_SUPPORTED_ERR,
|
|
name: 'NotSupportedError',
|
|
message: 'Partial keyframes are not supported'
|
|
};
|
|
}
|
|
}
|
|
return propertySpecificKeyframeGroups;
|
|
}
|
|
|
|
|
|
function makeInterpolations(propertySpecificKeyframeGroups) {
|
|
var interpolations = [];
|
|
for (var groupName in propertySpecificKeyframeGroups) {
|
|
var group = propertySpecificKeyframeGroups[groupName];
|
|
for (var i = 0; i < group.length - 1; i++) {
|
|
var startTime = group[i].offset;
|
|
var endTime = group[i + 1].offset;
|
|
var startValue = group[i].value;
|
|
var endValue = group[i + 1].value;
|
|
if (startTime == endTime) {
|
|
if (endTime == 1) {
|
|
startValue = endValue;
|
|
} else {
|
|
endValue = startValue;
|
|
}
|
|
}
|
|
interpolations.push({
|
|
startTime: startTime,
|
|
endTime: endTime,
|
|
easing: group[i].easing,
|
|
property: groupName,
|
|
interpolation: scope.propertyInterpolation(groupName, startValue, endValue)
|
|
});
|
|
}
|
|
}
|
|
interpolations.sort(function(leftInterpolation, rightInterpolation) {
|
|
return leftInterpolation.startTime - rightInterpolation.startTime;
|
|
});
|
|
return interpolations;
|
|
}
|
|
|
|
|
|
if (WEB_ANIMATIONS_TESTING) {
|
|
testing.makePropertySpecificKeyframeGroups = makePropertySpecificKeyframeGroups;
|
|
testing.makeInterpolations = makeInterpolations;
|
|
}
|
|
|
|
})(webAnimationsShared, webAnimations1, webAnimationsTesting);
|