Resumo do Capítulo 13. Bitmaps
Observação
Este livro foi publicado na primavera de 2016 e não foi atualizado desde então. Há muito no livro que permanece valioso, mas parte do material está desatualizado e alguns tópicos não estão mais totalmente corretos ou completos.
O Xamarin.FormsImage
elemento exibe um bitmap. Todas as Xamarin.Forms plataformas suportam os formatos de arquivo JPEG, PNG, GIF e BMP.
Os bitmaps vêm Xamarin.Forms de quatro lugares:
- Pela Web, conforme especificado por um URL
- Incorporado como um recurso na biblioteca compartilhada
- Incorporado como um recurso nos projetos de aplicativos da plataforma
- De qualquer lugar que possa ser referenciado por um objeto .NET
Stream
, incluindoMemoryStream
Os recursos de bitmap na biblioteca compartilhada são independentes da plataforma, enquanto os recursos de bitmap nos projetos de plataforma são específicos da plataforma.
Observação
O texto do livro faz referências a Bibliotecas de Classes Portáteis, que foram substituídas por bibliotecas .NET Standard. Todo o código de exemplo do livro foi convertido para usar bibliotecas padrão do .NET.
O bitmap é especificado definindo a Source
propriedade de Image
para um objeto do tipo ImageSource
, uma classe abstrata com três derivadas:
UriImageSource
para acessar um bitmap na Web com base em umUri
objeto definido como suaUri
propriedadeFileImageSource
Para acessar um bitmap armazenado em um projeto de aplicativo de plataforma com base em uma pasta e caminho de arquivo definido como suaFile
propriedadeStreamImageSource
para carregar um bitmap usando um objeto .NETStream
especificado retornando umStream
de umFunc
conjunto para suaStream
propriedade
Alternativamente (e mais comumente), você pode usar os seguintes métodos estáticos da ImageSource
classe, todos os quais retornam ImageSource
objetos:
ImageSource.FromUri
para acessar um bitmap na Web com base em umUri
objetoImageSource.FromResource
para acessar um bitmap armazenado como um recurso inserido na PCL do aplicativo;ImageSource.FromResource
ouImageSource.FromResource
para acessar um bitmap em outro assembly de origemImageSource.FromFile
Para acessar um bitmap de um projeto de aplicativo de plataformaImageSource.FromStream
para carregar um bitmap com base em umStream
objeto
Não há classe equivalente dos Image.FromResource
métodos. A UriImageSource
classe é útil se você precisar controlar o cache. A FileImageSource
classe é útil em XAML. StreamImageSource
é útil para o carregamento assíncrono de Stream
objetos, enquanto ImageSource.FromStream
é síncrono.
Bitmaps independentes de plataforma
O projeto WebBitmapCode carrega um bitmap na Web usando ImageSource.FromUri
. O Image
elemento é definido como a Content
propriedade do ContentPage
, portanto, é restrito ao tamanho da página. Independentemente do tamanho do bitmap, um elemento restrito Image
é esticado até o tamanho de seu contêiner e o bitmap é exibido em seu tamanho máximo dentro do Image
elemento, mantendo a taxa de proporção do bitmap. As áreas além do Image
bitmap podem ser coloridas com BackgroundColor
.
O exemplo WebBitmapXaml é semelhante, mas simplesmente define a Source
propriedade como a URL. A conversão é tratada pela ImageSourceConverter
classe.
Ajuste e preenchimento
Você pode controlar como o bitmap é esticado definindo a Aspect
propriedade do Image
como um dos seguintes membros da Aspect
enumeração:
AspectFit
: respeita a proporção (padrão)Fill
: preenche a área, não respeita a proporçãoAspectFill
: preenche a área, mas respeita a proporção, realizada cortando parte do bitmap
Recursos incorporados
Você pode adicionar um arquivo de bitmap a uma PCL ou a uma pasta na PCL. Dê a ele uma ação de build de EmbeddedResource. O exemplo ResourceBitmapCode demonstra como usar ImageSource.FromResource
para carregar o arquivo. O nome do recurso passado para o método consiste no nome do assembly, seguido por um ponto, seguido pelo nome da pasta opcional e um ponto, seguido pelo nome do arquivo.
O programa define as VerticalOptions
propriedades e HorizontalOptions
do Image
como LayoutOptions.Center
, o que torna o Image
elemento irrestrito. O Image
e o bitmap são do mesmo tamanho:
- No iOS e no Android, o
Image
é o tamanho do pixel do bitmap. Há um mapeamento de um para um entre pixels de bitmap e pixels de tela. - Na Plataforma Universal do Windows, o
Image
é o tamanho do pixel do bitmap em unidades independentes de dispositivo. Na maioria dos dispositivos, cada pixel de bitmap ocupa vários pixels de tela.
O exemplo StackedBitmap coloca um Image
em uma vertical StackLayout
em XAML. Uma extensão de marcação chamada ImageResourceExtension
ajuda a referenciar o recurso inserido em XAML. Essa classe carrega apenas recursos do assembly no qual está localizada, portanto, não pode ser colocada em uma biblioteca.
Mais sobre dimensionamento
Geralmente, é desejável dimensionar bitmaps de forma consistente entre todas as plataformas.
Experimentando com StackedBitmap, você pode definir um WidthRequest
no Image
elemento em uma vertical StackLayout
para tornar o tamanho consistente entre as plataformas, mas você só pode reduzir o tamanho usando essa técnica.
Você também pode definir o HeightRequest
para tornar os tamanhos de imagem consistentes nas plataformas, mas a largura restrita do bitmap limitará a versatilidade dessa técnica. Para uma imagem em uma vertical StackLayout
, HeightRequest
deve ser evitado.
A melhor abordagem é começar com um bitmap maior que a largura do telefone em unidades independentes de dispositivo e definir WidthRequest
a largura desejada em unidades independentes de dispositivo. Isso é demonstrado no exemplo DeviceIndBitmapSize.
O MadTeaParty exibe o Capítulo 7 de Alice no País das Maravilhas, de Lewis Carroll, com as ilustrações originais de John Tenniel:
Navegando e esperando
O exemplo ImageBrowser permite que o usuário navegue pelas imagens de banco de imagens armazenadas no site do Xamarin. Ele usa a classe .NET WebRequest
para baixar um arquivo JSON com a lista de bitmaps.
Observação
Xamarin.Forms Os programas devem ser usados HttpClient
em vez de WebRequest
acessar arquivos pela Internet.
O programa usa um ActivityIndicator
para indicar que algo está acontecendo. À medida que cada bitmap é carregado, a propriedade somente IsLoading
leitura de Image
é true
. A IsLoading
propriedade é apoiada por uma propriedade associável, portanto, um PropertyChanged
evento é acionado quando essa propriedade é alterada. O programa anexa um manipulador a esse evento e usa a configuração atual de IsLoaded
para definir a IsRunning
propriedade do ActivityIndicator
.
Bitmaps de streaming
O ImageSource.FromStream
método cria um ImageSource
arquivo baseado em um .NET Stream
. O método deve ser passado um Func
objeto que retorna um Stream
objeto.
Acessando os fluxos
O exemplo BitmapStreams demonstra como usar o ImaageSource.FromStream
método para carregar um bitmap armazenado como um recurso inserido e carregar um bitmap na Web.
Gerando bitmaps em tempo de execução
Todas as Xamarin.Forms plataformas suportam o formato de arquivo BMP descompactado, que é fácil de construir em código e depois armazenar em um MemoryStream
arquivo . Essa técnica permite a criação algorítmica BmpMaker
de bitmaps em tempo de execução, conforme implementado na classe na biblioteca Xamrin.FormsBook.Toolkit .
O exemplo DiyGradientBitmap "Faça você mesmo" demonstra o uso de BmpMaker
para criar um bitmap com uma imagem de gradiente.
Bitmaps específicos da plataforma
Todas as Xamarin.Forms plataformas permitem armazenar bitmaps nos assemblies de aplicativos de plataforma. Quando recuperados por um Xamarin.Forms aplicativo, esses bitmaps de plataforma são do tipo FileImageSource
. Você os usa para:
- propriedade
Icon
deMenuItem
- propriedade
Icon
deToolbarItem
- propriedade
Image
deButton
Os assemblies de plataforma já contêm bitmaps para ícones e telas iniciais:
- No projeto iOS, na pasta Recursos
- No projeto Android, em subpastas da pasta Resources
- Nos projetos do Windows, na pasta Ativos (embora as plataformas Windows não restrinjam bitmaps a essa pasta)
O exemplo PlatformBitmaps usa código para exibir um ícone dos projetos de aplicativo de plataforma.
Resoluções de bitmap
Todas as plataformas permitem armazenar várias versões de imagens de bitmap para diferentes resoluções de dispositivos. No tempo de execução, a versão adequada é carregada com base na resolução do dispositivo da tela.
No iOS, esses bitmaps são diferenciados por um sufixo no nome do arquivo:
- Sem sufixo para dispositivos de 160 DPI (1 pixel para a unidade independente do dispositivo)
- Sufixo '@2x' para dispositivos de 320 DPI (2 pixels para a DIU)
- Sufixo '@3x' para dispositivos de 480 DPI (3 pixels para a DIU)
Um bitmap destinado a ser exibido como um quadrado de uma polegada existiria em três versões:
- MyImage.jpg em 160 pixels quadrados
- MyImage@2x.jpg em 320 pixels quadrados
- MyImage@3x.jpg com 480 pixels quadrados
O programa se referiria a esse bitmap como MyImage.jpg, mas a versão adequada é recuperada em tempo de execução com base na resolução da tela. Quando irrestrito, o bitmap sempre será renderizado em 160 unidades independentes de dispositivo.
Para Android, os bitmaps são armazenados em várias subpastas da pasta Resources :
- drawable-ldpi (baixo DPI) para dispositivos de 120 DPI (0,75 pixels para a DIU)
- drawable-mdpi (médio) para dispositivos de 160 DPI (1 pixel para a DIU)
- drawable-hdpi (alto) para dispositivos de 240 DPI (1,5 pixels para a DIU)
- drawable-xhdpi (extra alto) para dispositivos de 320 DPI (2 pixels para o DIU)
- drawable-xxhdpi (extra extra alto) para dispositivos de 480 DPI (3 pixels para a DIU)
- drawable-xxxhdpi (três altos extras) para dispositivos de 640 DPI (4 pixels para o DIU)
Para um bitmap destinado a ser renderizado em uma polegada quadrada, as várias versões do bitmap terão o mesmo nome, mas um tamanho diferente, e serão armazenadas nestas pastas:
- drawable-ldpi/MyImage.jpg com 120 pixels quadrados
- MDPI/MyImage.jpg desenhável com 160 pixels quadrados
- drawable-hdpi/MyImage.jpg com 240 pixels quadrados
- drawable-xhdpi/MyImage.jpg com 320 pixels quadrados
- drawable-xxhdpi/MyImage.jpg com 480 pixels quadrados
- drawable-xxxhdpi/MyImage.jpg com 640 pixels quadrados
O bitmap sempre será renderizado em 160 unidades independentes de dispositivo. (O modelo de solução padrão Xamarin.Forms inclui apenas as pastas hdpi, xhdpi e xxhdpi.)
O projeto UWP dá suporte a um esquema de nomenclatura de bitmap que consiste em um fator de dimensionamento em pixels por unidade independente de dispositivo como uma porcentagem, por exemplo:
- MyImage.scale-200.jpg a 320 pixels quadrados
Apenas algumas porcentagens são válidas. Os programas de amostra para este livro incluem apenas imagens com sufixos de escala 200 , mas os modelos de solução atuais Xamarin.Forms incluem escala 100, escala 125, escala 150 e escala 400.
Ao adicionar bitmaps aos projetos de plataforma, a ação de build deve ser:
- iOS: BundleResource
- Android: AndroidResource
- UWP: Conteúdo
O exemplo ImageTap cria dois objetos semelhantes a botões que consistem em Image
elementos com um TapGestureRecognizer
instalado. Pretende-se que os objetos tenham uma polegada quadrada. A Source
propriedade de Image
é definida usando OnPlatform
e On
objetos para fazer referência a nomes de arquivo potencialmente diferentes nas plataformas. As imagens de bitmap incluem números que indicam seu tamanho de pixel, para que você possa ver qual bitmap de tamanho é recuperado e renderizado.
Barras de ferramentas e seus ícones
Um dos principais usos de bitmaps específicos da plataforma é a Xamarin.Forms barra de ferramentas, que é construída adicionando ToolbarItem
objetos à ToolbarItems
coleção definida pelo Page
. ToobarItem
deriva do MenuItem
qual herda algumas propriedades.
As propriedades mais importantes ToolbarItem
são:
Text
para texto que pode aparecer dependendo da plataforma eOrder
Icon
do tipoFileImageSource
para a imagem que pode aparecer dependendo da plataforma eOrder
Order
do tipoToolbarItemOrder
, uma enumeração com três membros,Default
,Primary
, eSecondary
.
O número de Primary
itens deve ser limitado a três ou quatro. Você deve incluir uma Text
configuração para todos os itens. Para a maioria das plataformas, apenas os itens exigem umIcon
, mas o Primary
Windows 8.1 requer um Icon
para todos os itens. Os ícones devem ter 32 unidades independentes de dispositivo quadradas. O FileImageSource
tipo indica que eles são específicos da plataforma.
O ToolbarItem
dispara um Clicked
evento quando tocado, muito parecido com um Button
. ToolbarItem
também suporta Command
e CommandParameter
propriedades frequentemente usadas em conexão com o MVVM. (Veja Capítulo 18, MVVM).
Tanto o iOS quanto o Android exigem que uma página que exibe uma barra de ferramentas seja uma NavigationPage
ou uma página navegada por um NavigationPage
. O programa ToolbarDemo define a MainPage
propriedade de sua App
classe para oNavigationPage
construtor com um ContentPage
argumento e demonstra a construção e o manipulador de eventos de uma barra de ferramentas.
Imagens de botões
Você também pode usar bitmaps específicos da plataforma para definir a Image
propriedade de Button
como um bitmap de 32 unidades independentes de dispositivo quadrado, conforme demonstrado pelo exemplo ButtonImage .
Observação
O uso de imagens nos botões foi aprimorado. Consulte Uso de bitmaps com botões.