Полагаю, лучший выбор - создать для этого многократно используемую функцию.Вы можете воспользоваться анимационными ресурсами из xamarin.forms .
Например, вы можете создать метод расширения, который обеспечит вам хороший и простой способ повторного использования в любом месте, например FadeTo
или TranslateTo
...
Это довольно просто, за исключением логики, которая плавно меняет цвет в данном конкретном случае.Вот код:
public static class AnimationExtensions
{
public static Task<bool> ChangeBackgroundColorTo(this Button self, Color newColor, uint length = 250, Easing easing = null)
{
Task<bool> ret = new Task<bool>(() => false);
if (!self.AnimationIsRunning(nameof(ChangeBackgroundColorTo)))
{
Color fromColor = self.BackgroundColor;
try
{
Func<double, Color> transform = (t) =>
Color.FromRgba(fromColor.R + t * (newColor.R - fromColor.R),
fromColor.G + t * (newColor.G - fromColor.G),
fromColor.B + t * (newColor.B - fromColor.B),
fromColor.A + t * (newColor.A - fromColor.A));
ret = TransmuteColorAnimation(self, nameof(ChangeBackgroundColorTo), transform, length, easing);
}
catch (Exception ex)
{
// to supress animation overlapping errors
self.BackgroundColor = fromColor;
}
}
return ret;
}
private static Task<bool> TransmuteColorAnimation(Button button, string name, Func<double, Color> transform, uint length, Easing easing)
{
easing = easing ?? Easing.Linear;
var taskCompletionSource = new TaskCompletionSource<bool>();
button.Animate(name, transform, (color) => { button.BackgroundColor = color; }, 16, length, easing, (v, c) => taskCompletionSource.SetResult(c));
return taskCompletionSource.Task;
}
}
Импортируя этот класс (по ссылке using namespace
), вы сможете использовать его, как показано ниже.
Объявление кнопки XAML
:
<Button Text="Nice button ;)"
BackgroundColor="Gray"
x:Name="btnTeste"
Clicked="btnTest_Click"/>
Обработка щелчка в выделенном коде:
private async void btnTest_Click(object sender, EventArgs args)
{
#region You will not need this block, it is just to choose a random color for change to
var colors = new[] { Color.Red, Color.Pink, Color.Silver, Color.Yellow, Color.Black, Color.Green };
var rnd = new Random();
var actualColor = btnTeste.BackgroundColor;
var randomColor = colors.Where(c => c != actualColor).ToArray()[rnd.Next(0, colors.Length - 2)];
#endregion
// Here is the effective use of the smooth background color change animation
await btnTeste.ChangeBackgroundColorTo(randomColor, 150, Easing.CubicOut);
await btnTeste.ChangeBackgroundColorTo(actualColor, 100, Easing.SinOut);
}
РЕДАКТИРОВАТЬ:
Вот результат (GIF показывает клики и двойныещелкает, чтобы вы могли увидеть много плавных изменений):
![effect example](https://i.stack.imgur.com/rxCuD.gif)