Xamarin Forms - Obtendo informações da tela do dispositivo


 Neste artigo vou mostrar como obter informações da tela do dispositivo usando a biblioteca Xamarin Essentials.

A classe DeviceDisplay da biblioteca Xamarin Essentials fornece informações sobre as métricas de tela do dispositivo no qual o aplicativo está sendo executado e pode solicitar para evitar que a tela fique suspensa quando o aplicativo está em execução.

Esta classe também expõe um evento - OnMainDisplayInfoChanged - que pode ser assinado e que é disparado sempre que ocorre alterações nas métricas da tela.

    DeviceDisplay.MainDisplayInfoChanged += OnMainDisplayInfoChanged;
    void OnMainDisplayInfoChanged(DisplayInfoChangedEventArgs  e)
    {
        // Processa alterações
        var displayInfo = e.DisplayInfo;
    }

Além disso esta classe expõe uma propriedade bool chamada KeepScreenOn que pode ser definida para tentar evitar o bloqueio ou desligamento da tela do dispositivo.

 DeviceDisplay.KeepScreenOn = !DeviceDisplay.KeepScreenOn;

A Xamarin.Essentials é uma nova biblioteca oficial da Microsoft que fornece aos desenvolvedores mais de 30 APIs de plataforma cruzada para que seus aplicativos móveis acessem os recursos nativos. Isso pode parecer similar aos Plugins for Xamarin, mas é uma evolução que é super otimizada para cada plataforma, fornece uma API consistente e é bem documentada sendo também open source no GitHub.

Motivos para usar:

Se você não conhesse essa biblioteca leia o meu artigo:  Introdução ao Xamarin Essentials e veja também as referências em: Get Start with Xamarin Essentials

Vamos lá...

Recursos usados:

Criando o projeto e instalando as dependências

Abra o  VS 2017 Community e clique em New Project e a seguir escolha Cross Platform -> Mobile App (Xamarin.Forms) e informe o nome XF_InfoTela:

A seguir selecione a Plataforma, eu marquei somente Android, e escolha a estratégia de compartilhamento que será .NET Standard.

Clique no botão OK. (Eu estou criando apenas o projeto Android mas fique a vontade para criar os demais projetos)

Pronto nosso projeto já esta criado. ( Atualmente(11/2018) a versão mais atual estável é a 3.4.0.1)

No menu Tools, clique em Nuget Package Manager e a seguir em Manage Nuget Packages for Solution;

Digite : Xamarin.Essentials para localizar o pacote e a seguir marque o pacote e instale-o em todos os projetos:

Pronto ! agora já temos todos os recursos necessários nos projetos; falta fazer alguns ajustes no projeto Android.

Ajustes a serem feitos na plataforma Android

No momento em que esse artigo foi escrito os ajustes necessários na plataforma Android eram os seguintes :

No arquivo MainActivity.cs inclua a seguinte instrução:

 Xamarin.Essentials.Platform.Init(this, savedInstanceState);

A seguir inclua também o método abaixo:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
    Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

Definindo o código da MainPage

Agora abra o arquivo MainPage.xaml e inclua as seguintes views usando um layout StackLayout:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:XF_InfoTela"
             x:Class="XF_InfoTela.MainPage">
    <StackLayout>
        <Label Margin="0,0,0,10" Text="Informações da Tela" FontAttributes="Bold" FontSize="Large" 
                   TextColor="#CA6F1E"  HorizontalTextAlignment="Center" ></Label>
        <Label x:Name="lblOrientacao" Margin="0,0,0,10" HorizontalTextAlignment="Center"></Label>
        <Label x:Name="lblRotacao" Margin="0,0,0,10" HorizontalTextAlignment="Center"></Label>
        <Label x:Name="lblLargura" Margin="0,0,0,10" HorizontalTextAlignment="Center"></Label>
        <Label x:Name="lblAltura" Margin="0,0,0,10" HorizontalTextAlignment="Center"></Label>
        <Label x:Name="lblDensidade" Margin="0,0,0,10" HorizontalTextAlignment="Center"></Label>
        <Button x:Name="btnInfoTela" Text="Obter Informações da Tela" Clicked="btnInfoTela_Clicked"/>
    </StackLayout>
</ContentPage>

Agora abra o arquivo MainPage.xaml.cs e defina o código para o evento do botão :

using Xamarin.Essentials;
using Xamarin.Forms;
namespace XF_InfoTela
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }
        private void btnInfoTela_Clicked(object sender, System.EventArgs e)
        {
            // Obtem os dados
            var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;
            // Orientação(Landscape, Portrait, Square, Unknown)
            var orientacao = mainDisplayInfo.Orientation;
            lblOrientacao.Text = "Orientação : " + orientacao.ToString();
            // Rotação (0, 90, 180, 270)
            var rotacao = mainDisplayInfo.Rotation;
            lblRotacao.Text = "Rotação :  " + rotacao.ToString();
            // Largura (in pixels)
            var largura = mainDisplayInfo.Width;
            lblLargura.Text = "Largura (pixels) : " + largura.ToString();
            // Altura (in pixels)
            var altura = mainDisplayInfo.Height;
            lblAltura.Text = "Altura (pixels) : " + altura.ToString();
            // Densidade da tela
            var densidade = mainDisplayInfo.Density;
            lblDensidade.Text = "Densidade : " + densidade.ToString();
        }
    }
}

Executando o projeto teremos o seguinte resultado:

Pegue o código das páginas aqui :  XF_InfoTela.zip (somente o projeto compartilhado)

"Disse-lhe Jesus: Eu sou o caminho, e a verdade e a vida; ninguém vem ao Pai, senão por mim."
João 14:6

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti