Icono de carga para la pantalla de diseño de Xamarin para Android

Quiero saber si hay buenas ideas / tutoriales sobre cómo agregar gifs de carga a un diseño de Android cuando se procesa y cuando un diseño de página navega a otro diseño de página.

He intentado usar esto – AndHud

Pero parece que no funciona bien con las bibliotecas de clase de portal (PCL) y los servicios dentro de PCL. No pude encontrar muchos ejemplos con este componente.

Veo que Android usa un cuadro de diálogo de progreso para esto, pero esperaba una versión de Xamarin en C # o cualquier otra forma inteligente de hacerlo.

Agregue AndHUD al proyecto de Android y BTProgressHUD a su proyecto de iOS.

Entonces solo necesitas crear una interfaz en la PCL como esta:

public enum MaskType { None = 1, Clear, Black, Gradient } public interface IHudService { void Show(string message, MaskType maskType, int progress = -1); void Dismiss(); void ShowToast(string message, bool showToastCentered = true, double timeoutMs = 1000); void ShowToast(string message, MaskType maskType, bool showToastCentered = true, double timeoutMs = 1000); } 

e implementaciones concretas en cada uno de los proyectos (ejemplo de iOS):

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using BigTed; using Foundation; using MyExample.Services; using UIKit; [assembly: Xamarin.Forms.Dependency(typeof(MyExample.iOS.Services.HudService))] namespace MyExample.iOS.Services { public class HudService : IHudService { public HudService() { } #region IHudService Members public void Show(string message, MaskType maskType, int progress) { float p = (float)progress / 100f; BTProgressHUD.Show(message, p, (ProgressHUD.MaskType)maskType); } public void Dismiss() { BTProgressHUD.Dismiss(); } public void ShowToast(string message, bool showToastCentered = true, double timeoutMs = 1000) { BTProgressHUD.ShowToast(message, showToastCentered, timeoutMs); } public void ShowToast(string message, MaskType maskType, bool showToastCentered = true, double timeoutMs = 1000) { BTProgressHUD.ShowToast(message, (ProgressHUD.MaskType)maskType, showToastCentered, timeoutMs); } #endregion } } 

Y, en Android:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; using Android.Views; using Android.Widget; using AndroidHUD; using MyExample.Services; using Xamarin.Forms; using XHUD; [assembly: Xamarin.Forms.Dependency(typeof(MyExample.Android.Services.HudService))] namespace MyExample.Android.Services { public class HudService : IHudService { //Although, not well documented, for Xamarin.Forms, "Forms.Context" is the current activity public HudService() { } #region IHudService Members public void Show(string message, MyExample.Services.MaskType maskType, int progress) { AndHUD.Shared.Show(Forms.Context, message, progress, (AndroidHUD.MaskType)maskType); } public void Dismiss() { AndHUD.Shared.Dismiss(Forms.Context); } public void ShowToast(string message, bool showToastCentered = true, double timeoutMs = 1000) { AndHUD.Shared.ShowToast(Forms.Context, message, (AndroidHUD.MaskType)MyExample.Services.MaskType.Black, TimeSpan.FromSeconds(timeoutMs / 1000), showToastCentered); } public void ShowToast(string message, MyExample.Services.MaskType maskType, bool showToastCentered = true, double timeoutMs = 1000) { AndHUD.Shared.ShowToast(Forms.Context, message, (AndroidHUD.MaskType)maskType, TimeSpan.FromSeconds(timeoutMs / 1000), showToastCentered); } #endregion } } 

Básicamente, esto es solo una copia de la fachada XHUD.HUD que se agregó a ambas bibliotecas para suavizar las diferencias de API.

Luego, registre su servicio en el punto de entrada para los proyectos específicos de la plataforma (en este caso, AppDelegate.cs) y llámelo desde PCL. En mi caso, estoy usando Xamarin.Forms.Labs, por lo que su método de registro puede variar.

 public override bool FinishedLaunching(UIApplication app, NSDictionary options) { SetupIocContainer(); Forms.Init(); FormsMaps.Init(); window = new UIWindow(UIScreen.MainScreen.Bounds); window.RootViewController = App.GetMainPage().CreateViewController(); window.MakeKeyAndVisible(); return true; } private void SetupIocContainer() { var resolverContainer = new SimpleContainer(); var app = new XFormsAppiOS(); app.Init(this); resolverContainer.Register(t => AppleDevice.CurrentDevice) .Register(t => t.Resolve().Display) //EDIT: this does not seem necessary after all and actually //causes it to crash on Android (but works on iOS) //not sure why //.Register(t => t.Resolve()) .Register(app) .Register(t => resolverContainer); Resolver.SetResolver(resolverContainer.GetResolver()); } 

En el PCL, puede crear una instancia y hacer algo como esto:

 private IHudService hudService; public IHudService HudService { get { if(hudService == null) { hudService = DependencyService.Get(); } return this.hudService; } } private async Task Setup() { this.HudService.Show("Long operation occurring", MaskType.Black); await Operation(); this.HudService.Dismiss(); }