Funciones de aceleración en Xamarin.Forms
Xamarin.Forms incluye una clase Aceleración que permite especificar una función de transferencia que controla cómo se aceleran o ralentizan las animaciones a medida que se ejecutan. En este artículo se muestra cómo consumir las funciones de aceleración predefinidas y cómo crear funciones de aceleración personalizadas.
La clase Easing
define una serie de funciones de aceleración que las animaciones pueden consumir:
- La función de aceleración
BounceIn
rebota la animación al principio. - La función de aceleración
BounceOut
rebota la animación al final. - La función de aceleración
CubicIn
acelera lentamente la animación. - La función de aceleración
CubicInOut
acelera la animación al principio y ralentiza la animación al final. - La función de aceleración
CubicOut
ralentiza rápidamente la animación. - La función de aceleración
Linear
usa una velocidad constante y es la función de aceleración predeterminada. - La función de aceleración
SinIn
acelera suavemente la animación. - La función de aceleración
SinInOut
acelera suavemente la animación al principio y ralentiza suavemente la animación al final. - La función de aceleración
SinOut
ralentiza suavemente la animación. - La función de aceleración
SpringIn
hace que la animación se acelere muy rápidamente hacia el final. - La función de aceleración
SpringOut
hace que la animación se desacelere rápidamente hacia el final.
Los sufijos In
y Out
indican si el efecto proporcionado por la función de aceleración es notable al principio de la animación, al final o ambos.
Además, se pueden crear funciones de aceleración personalizadas. Para obtener más información, consulte Funciones de aceleración personalizadas.
Uso de una función de aceleración
Los métodos de extensión de animación de la clase ViewExtensions
permiten especificar una función de aceleración como parámetro de método final, como se muestra en el ejemplo de código siguiente:
await image.TranslateTo(0, 200, 2000, Easing.BounceIn);
await image.ScaleTo(2, 2000, Easing.CubicIn);
await image.RotateTo(360, 2000, Easing.SinInOut);
await image.ScaleTo(1, 2000, Easing.CubicOut);
await image.TranslateTo(0, -200, 2000, Easing.BounceOut);
Al especificar una función de aceleración para una animación, la velocidad de animación se convierte en no lineal y genera el efecto proporcionado por la función de aceleración. Omitir una función de aceleración al crear una animación hace que la animación use la función de aceleración Linear
predeterminada, que produce una velocidad lineal.
Nota:
Xamarin.Forms 5.0 incluye un convertidor de tipos que convierte una representación de cadena de una función de aceleración en el miembro de enumeración adecuado Easing
. Este convertidor de tipos se invoca automáticamente en cualquier propiedad de tipo Easing
que se establezca en XAML.
Para obtener más información sobre el uso de los métodos de extensión de animación en la clase ViewExtensions
, vea Animaciones simples. La clase Animation
también puede consumir funciones de aceleración. Para más información, consulte Animaciones personalizadas.
Funciones de aceleración personalizadas
Hay tres métodos principales para crear una función de aceleración personalizada:
- Crear un método que tome un argumento
double
y devuelva un resultadodouble
. - Crear un control
Func<double, double>
. - Especificar la función de aceleración como argumento para el constructor
Easing
.
En los tres casos, la función de aceleración personalizada debe devolver 0 para un argumento de 0, y 1 para un argumento de 1. Sin embargo, se puede devolver cualquier valor entre los valores 0 y 1 del argumento. Ahora se analizará cada enfoque de uno en uno.
Método de aceleración personalizada
Una función de aceleración personalizada se puede definir como un método que toma un argumento double
y devuelve un resultado double
, como se muestra en el ejemplo de código siguiente:
double CustomEase (double t)
{
return t == 0 || t == 1 ? t : (int)(5 * t) / 5.0;
}
await image.TranslateTo(0, 200, 2000, (Easing)CustomEase);
El método CustomEase
trunca el valor entrante en los valores 0, 0.2, 0.4, 0.6, 0.8 y 1. Por lo tanto, la instancia Image
se traduce en saltos discretos, en lugar de suaves.
Función de aceleración personalizada
Una función de aceleración personalizada también se puede definir como un Func<double, double>
, como se muestra en el ejemplo de código siguiente:
Func<double, double> CustomEaseFunc = t => 9 * t * t * t - 13.5 * t * t + 5.5 * t;
await image.TranslateTo(0, 200, 2000, CustomEaseFunc);
El CustomEaseFunc
representa una función de aceleración que comienza rápido, se ralentiza y invierte el curso y, a continuación, vuelve a invertir el curso para acelerar rápidamente hacia el final. Por lo tanto, mientras que el movimiento general de la instancia Image
es hacia abajo, también invierte temporalmente el curso a mitad de la animación.
Constructor de aceleración personalizada
Una función de aceleración personalizada también se puede definir como el argumento para el constructor Easing
, como se muestra en el ejemplo de código siguiente:
await image.TranslateTo (0, 200, 2000, new Easing (t => 1 - Math.Cos (10 * Math.PI * t) * Math.Exp (-5 * t)));
La función de aceleración personalizada se especifica como un argumento de función lambda para el constructor Easing
y usa el método Math.Cos
para crear un efecto de caída lento que el método Math.Exp
amortigua. Por lo tanto, la instancia Image
se traslada para que parezca que se coloca en su lugar de descanso final.
Resumen
En este artículo se muestra cómo consumir las funciones de aceleración predefinidas y cómo crear funciones de aceleración personalizadas. Xamarin.Forms incluye una clase Easing
que permite especificar una función de transferencia que controla cómo se aceleran o ralentizan las animaciones a medida que se ejecutan.