Support hex values in outputRange

Summary: 1. Should I add an example of this to the UIExplorer Animation example?

2. Should I support mixing hex and rgba values in outputRange? It is possible with this implementation, but may cause confusion
Closes https://github.com/facebook/react-native/pull/3177

Reviewed By: @​svcscm

Differential Revision: D2506947

Pulled By: @vjeux
This commit is contained in:
Dral 2015-10-04 14:35:48 -07:00 коммит произвёл facebook-github-bot-3
Родитель 8356b609a5
Коммит 463b072dac
2 изменённых файлов: 62 добавлений и 6 удалений

Просмотреть файл

@ -11,6 +11,8 @@
*/ */
'use strict'; 'use strict';
var tinycolor = require('tinycolor2');
// TODO(#7644673): fix this hack once github jest actually checks invariants // TODO(#7644673): fix this hack once github jest actually checks invariants
var invariant = function(condition, message) { var invariant = function(condition, message) {
if (!condition) { if (!condition) {
@ -163,6 +165,18 @@ function interpolate(
return result; return result;
} }
function colorToRgba(
input: string
): string {
var color = tinycolor(input);
if (color.isValid()) {
var {r, g, b, a} = color.toRgb();
return `rgba(${r}, ${g}, ${b}, ${a === undefined ? 1 : a})`;
} else {
return input;
}
}
var stringShapeRegex = /[0-9\.-]+/g; var stringShapeRegex = /[0-9\.-]+/g;
/** /**
@ -178,6 +192,7 @@ function createInterpolationFromStringOutputRange(
): (input: number) => string { ): (input: number) => string {
var outputRange: Array<string> = (config.outputRange: any); var outputRange: Array<string> = (config.outputRange: any);
invariant(outputRange.length >= 2, 'Bad output range'); invariant(outputRange.length >= 2, 'Bad output range');
outputRange = outputRange.map(colorToRgba);
checkPattern(outputRange); checkPattern(outputRange);
// ['rgba(0, 100, 200, 0)', 'rgba(50, 150, 250, 0.5)'] // ['rgba(0, 100, 200, 0)', 'rgba(50, 150, 250, 0.5)']

Просмотреть файл

@ -10,7 +10,8 @@
jest jest
.dontMock('Interpolation') .dontMock('Interpolation')
.dontMock('Easing'); .dontMock('Easing')
.dontMock('tinycolor2');
var Interpolation = require('Interpolation'); var Interpolation = require('Interpolation');
var Easing = require('Easing'); var Easing = require('Easing');
@ -223,6 +224,39 @@ describe('Interpolation', () => {
expect(interpolation(1)).toBe('rgba(50, 150, 250, 0.5)'); expect(interpolation(1)).toBe('rgba(50, 150, 250, 0.5)');
}); });
it('should work with output ranges as short hex string', () => {
var interpolation = Interpolation.create({
inputRange: [0, 1],
outputRange: ['#024', '#9BF'],
});
expect(interpolation(0)).toBe('rgba(0, 34, 68, 1)');
expect(interpolation(0.5)).toBe('rgba(76.5, 110.5, 161.5, 1)');
expect(interpolation(1)).toBe('rgba(153, 187, 255, 1)');
});
it('should work with output ranges as long hex string', () => {
var interpolation = Interpolation.create({
inputRange: [0, 1],
outputRange: ['#FF9500', '#87FC70'],
});
expect(interpolation(0)).toBe('rgba(255, 149, 0, 1)');
expect(interpolation(0.5)).toBe('rgba(195, 200.5, 56, 1)');
expect(interpolation(1)).toBe('rgba(135, 252, 112, 1)');
});
it('should work with output ranges with mixed hex and rgba strings', () => {
var interpolation = Interpolation.create({
inputRange: [0, 1],
outputRange: ['rgba(100, 120, 140, .5)', '#87FC70'],
});
expect(interpolation(0)).toBe('rgba(100, 120, 140, 0.5)');
expect(interpolation(0.5)).toBe('rgba(117.5, 186, 126, 0.75)');
expect(interpolation(1)).toBe('rgba(135, 252, 112, 1)');
});
it('should work with negative and decimal values in string ranges', () => { it('should work with negative and decimal values in string ranges', () => {
var interpolation = Interpolation.create({ var interpolation = Interpolation.create({
inputRange: [0, 1], inputRange: [0, 1],
@ -242,12 +276,19 @@ describe('Interpolation', () => {
expect(() => { interpolation('45rad'); }).toThrow(); expect(() => { interpolation('45rad'); }).toThrow();
}); });
it('should crash when defining output range with different pattern', () => { it('should support a mix of color patterns', () => {
expect(() => Interpolation.create({ var interpolation = Interpolation.create({
inputRange: [0, 1], inputRange: [0, 1, 2],
outputRange: ['rgba(0, 100, 200, 0)', 'rgb(50, 150, 250)'], outputRange: ['rgba(0, 100, 200, 0)', 'rgb(50, 150, 250)', 'red'],
})).toThrow(); });
expect(interpolation(0)).toBe('rgba(0, 100, 200, 0)');
expect(interpolation(0.5)).toBe('rgba(25, 125, 225, 0.5)');
expect(interpolation(1.5)).toBe('rgba(152.5, 75, 125, 1)');
expect(interpolation(2)).toBe('rgba(255, 0, 0, 1)');
});
it('should crash when defining output range with different pattern', () => {
expect(() => Interpolation.create({ expect(() => Interpolation.create({
inputRange: [0, 1], inputRange: [0, 1],
outputRange: ['20deg', '30rad'], outputRange: ['20deg', '30rad'],