Résumé du chapitre 13. Images bitmap
Remarque
Ce livre a été publié au printemps 2016 et n’a pas été mis à jour depuis. Il y a beaucoup dans le livre qui reste précieux, mais certains documents sont obsolètes, et certains sujets ne sont plus entièrement corrects ou complets.
L’élément Xamarin.FormsImage
affiche une bitmap. Toutes les Xamarin.Forms plateformes prennent en charge les formats de fichiers JPEG, PNG, GIF et BMP.
Les bitmaps Xamarin.Forms proviennent de quatre emplacements :
- Sur le web, comme spécifié par une URL
- Incorporé en tant que ressource dans la bibliothèque partagée
- Incorporé en tant que ressource dans les projets d’application de plateforme
- À partir de n’importe quel endroit qui peut être référencé par un objet .NET
Stream
, y comprisMemoryStream
Les ressources bitmap de la bibliothèque partagée sont indépendantes de la plateforme, tandis que les ressources bitmap dans les projets de plateforme sont spécifiques à la plateforme.
Remarque
Le texte du livre fait référence à des bibliothèques de classes portables, qui ont été remplacées par des bibliothèques .NET Standard. Tous les exemples de code du livre ont été convertis pour utiliser des bibliothèques .NET standard.
La bitmap est spécifiée en définissant la Source
propriété d’un Image
objet de type ImageSource
, une classe abstraite avec trois dérivés :
UriImageSource
pour accéder à une bitmap sur le web en fonction d’unUri
objet défini sur saUri
propriétéFileImageSource
pour accéder à une bitmap stockée dans un projet d’application de plateforme en fonction d’un dossier et d’un chemin d’accès de fichier défini sur saFile
propriétéStreamImageSource
pour charger une bitmap à l’aide d’un objet .NETStream
spécifié en retournant unStream
élément d’unFunc
jeu à saStream
propriété
Vous pouvez également utiliser les méthodes statiques suivantes de la ImageSource
classe, qui retournent ImageSource
tous les objets :
ImageSource.FromUri
pour accéder à une bitmap sur le web en fonction d’unUri
objetImageSource.FromResource
pour accéder à une bitmap stockée en tant que ressource incorporée dans la bibliothèque PCL de l’application ;ImageSource.FromResource
ouImageSource.FromResource
pour accéder à une bitmap dans un autre assembly sourceImageSource.FromFile
pour accéder à une bitmap à partir d’un projet d’application de plateformeImageSource.FromStream
pour charger une bitmap basée sur unStream
objet
Il n’existe pas d’équivalent de classe Image.FromResource
des méthodes. La UriImageSource
classe est utile si vous devez contrôler la mise en cache. La FileImageSource
classe est utile en XAML. StreamImageSource
est utile pour le chargement asynchrone d’objets Stream
, tandis qu’il ImageSource.FromStream
est synchrone.
Bitmaps indépendantes de la plateforme
Le projet WebBitmapCode charge une bitmap sur le web à l’aide ImageSource.FromUri
de . L’élément Image
est défini sur la Content
propriété du ContentPage
, de sorte qu’il est limité à la taille de la page. Quelle que soit la taille de la bitmap, un élément contraint Image
est étiré à la taille de son conteneur, et la bitmap est affichée dans sa taille maximale dans l’élément Image
tout en conservant les proportions de la bitmap. Les zones de l’au-delà Image
de la bitmap peuvent être colorées avec BackgroundColor
.
L’exemple WebBitmapXaml est similaire, mais définit simplement la Source
propriété sur l’URL. La conversion est gérée par la ImageSourceConverter
classe.
Ajuster et remplir
Vous pouvez contrôler la façon dont la bitmap est étirée en définissant la propriété de l’un Aspect
Image
des membres suivants de l’énumération Aspect
:
AspectFit
: respecte les proportions (par défaut)Fill
: zone de remplissage, ne respecte pas les proportionsAspectFill
: remplit la zone, mais respecte les proportions, accomplies en rognant une partie de la bitmap
Ressources incorporées
Vous pouvez ajouter un fichier bitmap à un PCL ou à un dossier dans la bibliothèque PCL. Donnez-lui une action de génération d’EmbeddedResource. L’exemple ResourceBitmapCode montre comment utiliser ImageSource.FromResource
pour charger le fichier. Le nom de la ressource passé à la méthode se compose du nom de l’assembly, suivi d’un point, suivi du nom de dossier facultatif et d’un point, suivi du nom de fichier.
Le programme définit les propriétés et les VerticalOptions
propriétés de l’élément LayoutOptions.Center
Image
sur , ce qui rend l’élément Image
nonconstrainé.HorizontalOptions
La Image
bitmap et la même taille sont les mêmes :
- Sur iOS et Android, il
Image
s’agit de la taille de pixels de la bitmap. Il existe un mappage un-à-un entre les pixels bitmap et les pixels d’écran. - Sur plateforme Windows universelle, il
Image
s’agit de la taille de pixels de la bitmap dans les unités indépendantes de l’appareil. Sur la plupart des appareils, chaque pixel bitmap occupe plusieurs pixels d’écran.
L’exemple StackedBitmap place Image
une valeur verticale StackLayout
en XAML. Une extension de balisage nommée ImageResourceExtension
permet de référencer la ressource incorporée en XAML. Cette classe charge uniquement les ressources de l’assembly dans lequel elle se trouve, de sorte qu’elle ne peut pas être placée dans une bibliothèque.
Plus d’informations sur le dimensionnement
Il est souvent souhaitable de dimensionner des bitmaps de manière cohérente entre toutes les plateformes.
L’expérience avec StackedBitmap vous permet de définir une WidthRequest
valeur sur l’élément Image
d’une taille verticale StackLayout
pour rendre la taille cohérente entre les plateformes, mais vous ne pouvez réduire que la taille à l’aide de cette technique.
Vous pouvez également définir les HeightRequest
tailles d’image de manière cohérente sur les plateformes, mais la largeur contrainte de la bitmap limite la polyvalence de cette technique. Pour une image dans une image verticale StackLayout
, HeightRequest
doit être évitée.
La meilleure approche consiste à commencer par une bitmap plus large que la largeur du téléphone dans les unités indépendantes de l’appareil et définie WidthRequest
sur une largeur souhaitée dans les unités indépendantes de l’appareil. Ceci est illustré dans l’exemple DeviceIndBitmapSize .
Le MadTeaParty affiche le chapitre 7 de Lewis Carroll’s Alice’s Adventures in Wonderland avec les illustrations originales de John Tenniel :
Navigation et attente
L’exemple ImageBrowser permet à l’utilisateur de parcourir les images stock stockées sur le site web Xamarin. Il utilise la classe .NET WebRequest
pour télécharger un fichier JSON avec la liste des bitmaps.
Remarque
Xamarin.Forms les programmes doivent utiliser HttpClient
plutôt que WebRequest
d’accéder aux fichiers via Internet.
Le programme utilise un ActivityIndicator
élément pour indiquer que quelque chose se passe. À mesure que chaque bitmap est chargée, la propriété en lecture seule IsLoading
est Image
true
. La IsLoading
propriété est soutenue par une propriété pouvant être liée. Par conséquent, un PropertyChanged
événement est déclenché lorsque cette propriété change. Le programme attache un gestionnaire à cet événement et utilise le paramètre actuel pour IsLoaded
définir la IsRunning
propriété du ActivityIndicator
.
Bitmaps de diffusion en continu
La ImageSource.FromStream
méthode crée une ImageSource
méthode basée sur un .NET Stream
. La méthode doit être passée à un Func
objet qui retourne un Stream
objet.
Accès aux flux
L’exemple BitmapStreams montre comment utiliser la ImaageSource.FromStream
méthode pour charger une bitmap stockée en tant que ressource incorporée et charger une bitmap sur le web.
Génération de bitmaps au moment de l’exécution
Toutes les Xamarin.Forms plateformes prennent en charge le format de fichier BMP non compressé, qui est facile à construire dans le code, puis le stocker dans un MemoryStream
. Cette technique permet la création algorithmique de bitmaps au moment de l’exécution, comme implémentée dans la classe dans la BmpMaker
bibliothèque Xamrin.FormsBook.Toolkit .
L’exemple DiyGradientBitmap « Do It Yourself » illustre l’utilisation d’une BmpMaker
image bitmap avec une image dégradée.
Bitmaps spécifiques à la plateforme
Toutes les Xamarin.Forms plateformes permettent de stocker des bitmaps dans les assemblys d’application de plateforme. Lorsqu’elles sont récupérées par une Xamarin.Forms application, ces bitmaps de plateforme sont de type FileImageSource
. Vous les utilisez pour :
- propriété
Icon
deMenuItem
- propriété
Icon
deToolbarItem
- propriété
Image
deButton
Les assemblys de plateforme contiennent déjà des bitmaps pour les icônes et les écrans de démarrage :
- Dans le projet iOS, dans le dossier Ressources
- Dans le projet Android, dans les sous-dossiers du dossier Ressources
- Dans les projets Windows, dans le dossier Ressources (bien que les plateformes Windows ne limitent pas les bitmaps à ce dossier)
L’exemple PlatformBitmaps utilise du code pour afficher une icône à partir des projets d’application de plateforme.
Résolutions bitmap
Toutes les plateformes permettent de stocker plusieurs versions d’images bitmap pour différentes résolutions d’appareils. Au moment de l’exécution, la version appropriée est chargée en fonction de la résolution de l’appareil de l’écran.
Sur iOS, ces bitmaps sont différenciées par un suffixe sur le nom de fichier :
- Aucun suffixe pour les appareils PPP 160 (1 pixel à l’unité indépendante de l’appareil)
- Suffixe '@2x' pour 320 appareils PPP (2 pixels au DIU)
- Suffixe « @3x » pour 480 appareils PPP (3 pixels au DIU)
Une bitmap destinée à être affichée comme carré d’un pouce existerait dans trois versions :
- MyImage.jpg à 160 pixels carrés
- MyImage@2x.jpg à 320 pixels carrés
- MyImage@3x.jpg à 480 pixels carrés
Le programme fait référence à cette bitmap comme MyImage.jpg, mais la version appropriée est récupérée au moment de l’exécution en fonction de la résolution de l’écran. Lorsqu’elle n’est pas contrainte, la bitmap s’affiche toujours à 160 unités indépendantes de l’appareil.
Pour Android, les bitmaps sont stockées dans différents sous-dossiers du dossier Ressources :
- drawable-ldpi (faible PPP) pour 120 appareils DPI (0,75 pixels au DIU)
- drawable-mdpi (moyen) pour 160 appareils DPI (1 pixel au DIU)
- drawable-hdpi (élevé) pour 240 appareils DPI (1,5 pixels au DIU)
- drawable-xhdpi (extra élevé) pour 320 appareils DPI (2 pixels au DIU)
- drawable-xxhdpi (extra élevé) pour 480 appareils DPI (3 pixels au DIU)
- drawable-xxxhdpi (trois hauts supplémentaires) pour 640 appareils DPI (4 pixels au DIU)
Pour qu’une bitmap soit affichée à un pouce carré, les différentes versions de la bitmap auront le même nom, mais une taille différente et seront stockées dans ces dossiers :
- drawable-ldpi/MyImage.jpg à 120 pixels carrés
- drawable-mdpi/MyImage.jpg à 160 pixels carrés
- drawable-hdpi/MyImage.jpg à 240 pixels carrés
- drawable-xhdpi/MyImage.jpg à 320 pixels carrés
- drawable-xxhdpi/MyImage.jpg à 480 pixels carrés
- drawable-xxxhdpi/MyImage.jpg à 640 pixels carrés
La bitmap s’affiche toujours à 160 unités indépendantes de l’appareil. (Le modèle de solution standard Xamarin.Forms inclut uniquement les dossiers hdpi, xhdpi et xxhdpi.)
Le projet UWP prend en charge un schéma d’affectation de noms bitmap qui se compose d’un facteur de mise à l’échelle en pixels par unité indépendante de l’appareil, par exemple :
- MyImage.scale-200.jpg à 320 pixels carrés
Seuls certains pourcentages sont valides. Les exemples de programmes pour ce livre incluent uniquement des images avec des suffixes scale-200 , mais les modèles de solution actuels Xamarin.Forms incluent scale-100, scale-125, scale-150 et scale-400.
Lorsque vous ajoutez des bitmaps aux projets de plateforme, l’action de génération doit être :
- iOS : BundleResource
- Android : AndroidResource
- UWP : Contenu
L’exemple ImageTap crée deux objets de type bouton composés d’éléments Image
avec un TapGestureRecognizer
élément installé. Il est prévu que les objets soient carrés d’un pouce. La Source
propriété d’est Image
définie à l’aide OnPlatform
et On
les objets pour référencer des noms de fichiers potentiellement différents sur les plateformes. Les images bitmap incluent des nombres indiquant leur taille de pixel. Vous pouvez donc voir quelle taille de bitmap est récupérée et rendue.
Barres d’outils et leurs icônes
L’une des principales utilisations de bitmaps spécifiques à la plateforme est la Xamarin.Forms barre d’outils, qui est construite en ajoutant ToolbarItem
des objets à la ToolbarItems
collection définie par Page
. ToobarItem
dérive de MenuItem
laquelle il hérite de certaines propriétés.
Les propriétés les plus importantes ToolbarItem
sont les suivantes :
Text
pour le texte qui peut apparaître en fonction de la plateforme etOrder
Icon
de typeFileImageSource
pour l’image qui peut apparaître en fonction de la plateforme etOrder
Order
de typeToolbarItemOrder
, énumération avec trois membres,Default
Primary
, etSecondary
.
Le nombre d’éléments Primary
doit être limité à trois ou quatre. Vous devez inclure un Text
paramètre pour tous les éléments. Pour la plupart des plateformes, seuls les Primary
éléments nécessitent un Icon
élément, mais Windows 8.1 nécessite une Icon
pour tous les éléments. Les icônes doivent être 32 unités indépendantes de l’appareil carrées. Le FileImageSource
type indique qu’ils sont spécifiques à la plateforme.
Le ToolbarItem
déclenchement d’un Clicked
événement lorsqu’il est appuyé, comme un Button
. ToolbarItem
prend également en charge Command
et CommandParameter
les propriétés souvent utilisées en connexion avec MVVM. (Voir Chapitre 18, MVVM).
IOS et Android nécessitent qu’une page qui affiche une barre d’outils soit une NavigationPage
ou une page accédée par un NavigationPage
. Le programme ToolbarDemo définit la MainPage
propriété de sa App
classe sur le NavigationPage
constructeur avec un ContentPage
argument et illustre la construction et le gestionnaire d’événements d’une barre d’outils.
Images de bouton
Vous pouvez également utiliser des bitmaps spécifiques à la plateforme pour définir la propriété d’une Button
bitmap de 32 unités indépendantes de l’appareil, comme illustré par l’exemple ButtonImage.Image
Remarque
L’utilisation d’images sur des boutons a été améliorée. Voir Utiliser des bitmaps avec des boutons.