Ejemplo n.º 1
0
        /// Caso dê algum erro na autenticação, devemos voltar
        /// para o estado original das views, assim podemos
        /// fazer uma animação de retorno
        private async Task OnErrorLoadingAsync()
        {
            // Caso seu servidor responda muito rápido, pode ser que a
            // animação ainda esteja sendo executada, por isso
            // utilizamos o TaskCompletationSource para aguardar o término da animaçao de loading
            _ = await loadingAnimationTask.Task;

            // Voltamos a visibilidade do botao de login
            _ = await LoginButton.FadeTo(1, 100);

            // Deixaremos novamente o Frame no tamanho/posicão exatos do login
            var rectTo = new Rectangle(0, LoginButton.Y, LoginButton.Width, LoginButton.Height);

            // Criamos a transiçao do raio do frame + o tamanh/posição (Layout) + a cor defundo
            // E aguardamos a execução de todas
            _ = await Task.WhenAll(
                LoginFrame.CornerRadiusTo(LoginButton.CornerRadius),
                LoginFrame.LayoutTo(rectTo, 500, Easing.SpringOut),
                LoginFrame.BackgroundColorTo(Color.Transparent, 1000));

            // Finalizamos deixando o Frame Invisível
            // Pode parecer redundante, pois deixamos o fundo transparente
            // Mas parece que o comportamento do `IsVisible` não cooperou pra mim no IOS
            // Pode ser um bug na versão atual do Xamarin.Forms, ainda vou investigar mais
            LoginFrame.IsVisible = false;
        }
Ejemplo n.º 2
0
        /// Caso o login seja efetuado com sucesso iremos transitar para a MainPage
        private async Task OnSuccessLoginAsync()
        {
            // Caso seu servidor responda muito rápido, pode ser que a
            // animação ainda esteja sendo executada, por isso
            // utilizamos o TaskCompletationSource para aguardar o término da animaçao de loading
            _ = await loadingAnimationTask.Task;

            // Aqui a ideia é saber dinamicamente o quão deslocado do ponto zero, da ContentPage,
            // O LoginFrame está, para a gente conseguir deslocá-lo até o canto superior esquerdo da tela
            // Para isso calculamos sua posição absoluta
            (var absX, var absY) = ((VisualElement)LoginFrame.Parent).GetAbsolutePosition();

            // Criamos entao a posiçao final, reduzindo toda a posiçao absoluta do frame e
            // o tamanho total, que será o mesmo tamanho da página
            var rectTo = new Rectangle(-absX, -absY, this.Width, this.Height);

            // Buscamos, nos resources, a cor de fundo que aplicamos na MainPage
            // para simular que o botão está se tornando a proxima página
            var mainPageBackgroundColor = (Color)Application.Current.Resources["CorDeFundo"];

            // Criamos a transiçao do raio do frame + o tamanh/posição (Layout) + a cor defundo
            // E aguardamos a execução de todas
            _ = await Task.WhenAll(
                LoginFrame.CornerRadiusTo(0, 500),
                LoginFrame.LayoutTo(rectTo, 500, Easing.SpringOut),
                LoginFrame.BackgroundColorTo(mainPageBackgroundColor, 1000));

            // Por fim executamos a navegaçao para a MainPage
            await Navigation.PushAsync(new MainPage());
        }