Изображения в Xamarin.Forms
Изображения можно совместно использовать на разных платформах, их можно загружать специально для каждой платформы Xamarin.Formsили загружать их для отображения.
Изображения являются важной частью навигации приложений, удобства использования и фирменной символики. Xamarin.Forms приложениям необходимо предоставлять общий доступ к изображениям на всех платформах, но также отображать различные изображения на каждой платформе.
Изображения, относящиеся к платформе, также требуются для значков и экранов-заставок; их необходимо настроить на основе каждой платформы.
Отображение изображений
Xamarin.FormsImage
использует представление для отображения изображений на странице. У него есть несколько важных свойств:
Source
ImageSource
— экземпляр, файл, URI или ресурс, который задает изображение для отображения.Aspect
— Как размер изображения в границах, в которых он отображается (следует ли растянуть, обрезку или почтовое поле).
ImageSource
экземпляры можно получить с помощью статических методов для каждого типа источника изображения:
FromFile
— требуется имя файла или путь к файлу, которые можно разрешить на каждой платформе.FromUri
— требуется объект URI, например.new Uri("http://server.com/image.jpg")
.FromResource
— требуется идентификатор ресурса для файла изображения, внедренного в проект библиотеки приложения или .NET Standard, с действием сборки:EmbeddedResource.FromStream
— требуется поток, предоставляющий данные изображения.
Свойство Aspect
определяет, как будет масштабироваться изображение, чтобы соответствовать области отображения:
Fill
— растягивает изображение, чтобы полностью заполнить область отображения. Это может привести к искажению изображения.AspectFill
— клипирует изображение таким образом, чтобы он заполнял область отображения при сохранении аспекта (т. е. без искажений).AspectFit
— Почтовые ящики изображения (при необходимости), чтобы все изображение помещалось в область отображения, а пустое пространство добавляется в верхнюю или нижнюю или сторону в зависимости от того, является ли изображение широким или высоким.
Изображения можно загружать из локального файла, внедренного ресурса, скачиваемого или загружаемого из потока. Кроме того, значки шрифта можно отобразить в Image
представлении, указав данные значка шрифта в объекте FontImageSource
. Дополнительные сведения см. в руководстве по шрифтам для отображения значков шрифтов.
Локальные образы
Файлы изображений можно добавлять в каждый проект приложения и ссылаться на них из Xamarin.Forms общего кода. Этот метод распространения является обязательным для изображений, специфических для платформы, например при использовании разных разрешений на различных платформах или немного разных вариантах изображения.
Чтобы использовать один образ для всех приложений, одно и то же имя файла должно использоваться на каждой платформе, и оно должно быть допустимым именем ресурса Android (т. е. только строчными буквами, цифрами, символами подчеркивания и периодом).
- iOS — предпочтительный способ управления и поддержки образов, так как iOS 9 — использовать наборы образов каталога активов, которые должны содержать все версии образа, необходимые для поддержки различных устройств и коэффициентов масштабирования для приложения. Дополнительные сведения см. в разделе "Добавление изображений в набор образов каталога активов".
- Android — размещение изображений в каталоге Resources/drawable с помощью действия сборки: AndroidResource. Кроме того, можно предоставлять версии изображения с высоким и низким уровнем DPI (в соответствующих подкаталогах ресурсов, таких как drawable-ldpi, drawable-hdpi и drawable-xhdpi).
- универсальная платформа Windows (UWP) — по умолчанию изображения должны размещаться в корневом каталоге приложения с действием сборки: содержимое. Кроме того, изображения можно поместить в другой каталог, который затем указан с помощью конкретной платформы. Дополнительные сведения см . в каталоге образов по умолчанию в Windows.
Внимание
До iOS 9 изображения обычно помещаются в папку "Ресурсы " с действием сборки: BundleResource. Однако этот метод работы с изображениями в приложении iOS не рекомендуется apple. Дополнительные сведения см. в разделе "Размеры изображений" и "Имена файлов".
В соответствии с этими правилами именования и размещения файлов можно загрузить и отобразить изображение на всех платформах:
<Image Source="waterfront.jpg" />
Эквивалентный код C# выглядит следующим образом:
var image = new Image { Source = "waterfront.jpg" };
На следующих снимках экрана показан результат отображения локального изображения на каждой платформе:
Для повышения гибкости Device.RuntimePlatform
свойства можно использовать для выбора другого файла изображения или пути для некоторых или всех платформ, как показано в этом примере кода:
image.Source = Device.RuntimePlatform == Device.Android
? ImageSource.FromFile("waterfront.jpg")
: ImageSource.FromFile("Images/waterfront.jpg");
Внимание
Чтобы использовать одно и то же имя файла изображения на всех платформах, имя должно быть допустимым на всех платформах. На рисуемых устройствах Android имеются ограничения на именование — допускаются только строчные буквы, цифры, подчеркивание и период, а также для совместимости кроссплатформенной совместимости на всех других платформах. Пример имени файла waterfront.png соответствует правилам, но примеры недопустимых имен файлов включают "water front.png", "WaterFront.png", "water-front.png", "water-front.png" и "wåterfront.png".
Собственные разрешения (сетчатка и высокий DPI)
IOS, Android и UWP включают поддержку различных разрешений изображений, где операционная система выбирает соответствующий образ во время выполнения на основе возможностей устройства. Xamarin.Forms использует API собственных платформ для загрузки локальных образов, поэтому он автоматически поддерживает альтернативные разрешения, если файлы правильно именуются и находятся в проекте.
Предпочтительный способ управления изображениями, так как iOS 9 — перетаскивать изображения для каждого разрешения, необходимого для соответствующего набора образов каталога активов. Дополнительные сведения см. в разделе "Добавление изображений в набор образов каталога активов".
До iOS 9 версии изображения сетчатки можно поместить в папку Resources — два и три раза разрешение с помощью @2x или @3x суффиксов в имени файла до расширения файла (например). [email protected] Однако этот метод работы с изображениями в приложении iOS не рекомендуется apple. Дополнительные сведения см. в разделе "Размеры изображений" и "Имена файлов".
Изображения альтернативного разрешения Android должны размещаться в специально именованных каталогах в проекте Android, как показано на следующем снимке экрана:
Имена файлов образа UWP можно суффиксировать перед .scale-xxx
расширением файла, где xxx
процент масштабирования применяется к ресурсу, например myimage.scale-200.png. Затем изображения можно ссылаться на код или XAML без модификатора масштабирования, например только myimage.png. Платформа выберет ближайшее соответствующее масштабирование активов на основе текущего DPI дисплея.
Дополнительные элементы управления, отображающие изображения
Некоторые элементы управления имеют свойства, отображающие изображение, например:
Button
имеет свойство, которое можно задать наImageSource
растровое изображение, которое будет отображаться на экранеButton
. Дополнительные сведения см. в разделе "Использование растровых карт с кнопками".ImageButton
Source
имеет свойство, которое можно задать для отображения в изображенииImageButton
. Дополнительные сведения см. в разделе "Настройка источника изображения".ToolbarItem
IconImageSource
имеет свойство, которое можно задать для образа, загруженного из файла, внедренного ресурса, URI или потока.ImageCell
ImageSource
имеет свойство, которое можно задать для изображения, полученного из файла, внедренного ресурса, URI или потока.Page
. Любой тип страницы, производный отPage
имеющихIconImageSource
иBackgroundImageSource
свойств, которые можно назначить файл, внедренный ресурс, URI или поток. В определенных обстоятельствах, например приNavigationPage
отображенииContentPage
значка, будет отображаться, если она поддерживается платформой.Внимание
В iOS
Page.IconImageSource
свойство не может быть заполнено из образа в наборе образов каталога активов. Вместо этого загрузите изображения значков дляPage.IconImageSource
свойства из файла, внедренного ресурса, URI или потока.
Внедренные образы
Внедренные образы также поставляются с приложением (например, локальными изображениями), но вместо того, чтобы копия образа в структуре каждого приложения, файл изображения внедрен в сборку как ресурс. Этот метод распространения изображений рекомендуется использовать при использовании идентичных образов на каждой платформе и особенно подходит для создания компонентов, так как изображение упаковается с кодом.
Чтобы внедрить изображение в проект, щелкните правой кнопкой мыши, чтобы добавить новые элементы и выберите нужный образ. По умолчанию изображение будет иметь действие сборки: нет. Для этого необходимо задать действие сборки: EmbeddedResource.
Действие сборки можно просмотреть и изменить в окне свойств файла.
В этом примере идентификатор ресурса — WorkingWithImages.beach.jpg. Интегрированная среда разработки создала этот параметр по умолчанию путем объединения пространства имен по умолчанию для этого проекта с именем файла, используя период (.) между каждым значением.
Если вы помещаете внедренные изображения в папки в проекте, имена папок также разделяются точками (.) в идентификаторе ресурса. Перемещение изображения beach.jpg в папку с именем MyImages приведет к идентификатору ресурса WorkingWithImages.MyImages.beach.jpg
Код для загрузки внедренного образа просто передает идентификатор ресурса методу ImageSource.FromResource
, как показано ниже:
Image embeddedImage = new Image
{
Source = ImageSource.FromResource("WorkingWithImages.beach.jpg", typeof(MyClass).GetTypeInfo().Assembly)
};
Примечание.
Для поддержки отображения внедренных образов в режиме выпуска в универсальная платформа Windows необходимо использовать перегрузкуImageSource.FromResource
, указывающую исходную сборку, в которой выполняется поиск изображения.
В настоящее время для идентификаторов ресурсов нет неявного преобразования. Вместо этого необходимо использовать ImageSource.FromResource
или new ResourceImageSource()
загружать внедренные образы.
На следующих снимках экрана показан результат отображения внедренного изображения на каждой платформе:
XAML
Так как встроенный преобразователь типов в string
ResourceImageSource
не существует, эти типы изображений не могут быть загружены в машинном коде XAML. Вместо этого можно записать простое расширение разметки XAML для загрузки изображений с помощью идентификатора ресурса, указанного в XAML:
[ContentProperty (nameof(Source))]
public class ImageResourceExtension : IMarkupExtension
{
public string Source { get; set; }
public object ProvideValue (IServiceProvider serviceProvider)
{
if (Source == null)
{
return null;
}
// Do your translation lookup here, using whatever method you require
var imageSource = ImageSource.FromResource(Source, typeof(ImageResourceExtension).GetTypeInfo().Assembly);
return imageSource;
}
}
Примечание.
Для поддержки отображения внедренных образов в режиме выпуска в универсальная платформа Windows необходимо использовать перегрузкуImageSource.FromResource
, указывающую исходную сборку, в которой выполняется поиск изображения.
Чтобы использовать это расширение, добавьте настраиваемого xmlns
в XAML, используя правильные значения пространства имен и сборок для проекта. Затем источник изображения можно задать с помощью следующего синтаксиса: {local:ImageResource WorkingWithImages.beach.jpg}
Ниже показан полный пример XAML:
<?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:WorkingWithImages;assembly=WorkingWithImages"
x:Class="WorkingWithImages.EmbeddedImagesXaml">
<StackLayout VerticalOptions="Center" HorizontalOptions="Center">
<!-- use a custom Markup Extension -->
<Image Source="{local:ImageResource WorkingWithImages.beach.jpg}" />
</StackLayout>
</ContentPage>
Устранение неполадок внедренных образов
Отладка кода
Поскольку иногда трудно понять, почему конкретный ресурс изображения не загружается, в приложение можно временно добавить следующий код отладки, чтобы убедиться, что ресурсы настроены правильно. Он выводит все известные ресурсы, внедренные в данную сборку, в консоль , чтобы помочь отладить проблемы с загрузкой ресурсов.
using System.Reflection;
// ...
// NOTE: use for debugging, not in released app code!
var assembly = typeof(MyClass).GetTypeInfo().Assembly;
foreach (var res in assembly.GetManifestResourceNames())
{
System.Diagnostics.Debug.WriteLine("found resource: " + res);
}
Изображения, внедренные в другие проекты
По умолчанию метод ищет только изображения в той же сборке, ImageSource.FromResource
что и код, вызывающий ImageSource.FromResource
метод. Используя приведенный выше код отладки, можно определить, какие сборки содержат определенный ресурс, изменив typeof()
оператор на известный для каждой Type
сборки.
Однако исходная сборка, на которой выполняется поиск внедренного образа, может быть указана в качестве аргумента ImageSource.FromResource
метода:
var imageSource = ImageSource.FromResource("filename.png",
typeof(MyClass).GetTypeInfo().Assembly);
Скачивание изображений
Изображения можно скачать автоматически для отображения, как показано в следующем XAML:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WorkingWithImages.DownloadImagesXaml">
<StackLayout VerticalOptions="Center" HorizontalOptions="Center">
<Label Text="Image UriSource Xaml" />
<Image Source="https://aka.ms/campus.jpg" />
<Label Text="campus.jpg gets downloaded from microsoft.com" />
</StackLayout>
</ContentPage>
Эквивалентный код C# выглядит следующим образом:
var webImage = new Image {
Source = ImageSource.FromUri(
new Uri("https://aka.ms/campus.jpg")
) };
Для ImageSource.FromUri
метода требуется Uri
объект и возвращается новый UriImageSource
объект, который считывается из объекта Uri
.
Существует также неявное преобразование строк URI, поэтому следующий пример также будет работать:
webImage.Source = "https://aka.ms/campus.jpg";
На следующих снимках экрана показан результат отображения удаленного изображения на каждой платформе:
Скачанный кэширование изображений
Также поддерживает UriImageSource
кэширование скачанных образов, настроенных с помощью следующих свойств:
CachingEnabled
— включена ли кэширование (true
по умолчанию).CacheValidity
— ОпределяетTimeSpan
, сколько времени образ будет храниться локально.
Кэширование включено по умолчанию и будет хранить образ локально в течение 24 часов. Чтобы отключить кэширование для определенного изображения, создайте экземпляр источника образа следующим образом:
image.Source = new UriImageSource { CachingEnabled = false, Uri = new Uri("https://server.com/image") };
Чтобы задать определенный период кэша (например, 5 дней), создайте экземпляр источника образа следующим образом:
webImage.Source = new UriImageSource
{
Uri = new Uri("https://aka.ms/campus.jpg"),
CachingEnabled = true,
CacheValidity = new TimeSpan(5,0,0,0)
};
Встроенное кэширование упрощает поддержку таких сценариев, как прокрутка списков изображений, где можно задать (или привязать) изображение в каждой ячейке и позволить встроенному кэшу повторно загружать изображение, когда ячейка прокручивается обратно в представление.
Анимированные GIF-файлы
Xamarin.Forms включает поддержку отображения небольших анимированных GIF-файлов. Это достигается путем установки Image.Source
свойства в анимированный GIF-файл:
<Image Source="demo.gif" />
Внимание
Хотя поддержка анимированных GIF-файлов Xamarin.Forms включает возможность скачивания файлов, она не поддерживает кэширование или потоковую потоковую анимированные GIF-файлы.
По умолчанию при загрузке анимированного GIF-файла он не будет воспроизводиться. Это связано с тем, что IsAnimationPlaying
свойство, которое определяет, воспроизводит ли анимированный GIF-файл или останавливается, имеет значение false
по умолчанию. Это свойство типа bool
поддерживается BindableProperty
объектом, что означает, что он может быть целевым объектом привязки данных и стилем.
Поэтому при загрузке анимированного GIF-файла он не будет воспроизводиться до тех пор, пока IsAnimationPlaying
свойство не будет задано true
. Затем воспроизведение можно остановить, задав IsAnimationPlaying
для свойства значение false
. Обратите внимание, что это свойство не действует при отображении источника изображения, отличного от GIF.
Примечание.
В Android поддержка анимированных GIF-файлов требует, чтобы приложение использовало быстрые отрисовщики и не будет работать, если вы решили использовать устаревшие отрисовщики. В UWP поддержка анимированных GIF-файлов требует минимального выпуска юбилейного обновления Windows 10 (версия 1607).
Значки и экраны-заставки
Хотя и не связаны с Image
представлением, значки приложений и экраны-заставки также важны для использования изображений в Xamarin.Forms проектах.
Настройка значков и экранов-заставок для Xamarin.Forms приложений выполняется в каждом из проектов приложений. Это означает создание правильного размера изображений для iOS, Android и UWP. Эти изображения должны быть названы и расположены в соответствии с требованиями каждой платформы.
Значки
Дополнительные сведения о создании этих ресурсов приложений см. в руководствах по работе с изображениями, Google Iconography и UWP для ресурсов плиток и значков.
Кроме того, значки шрифта можно отобразить в Image
представлении, указав данные значка шрифта в объекте FontImageSource
. Дополнительные сведения см. в руководстве по шрифтам для отображения значков шрифтов.
Экраны-заставки
Только для приложений iOS и UWP требуется экран-заставка (также называемый начальным экраном или изображением по умолчанию).
Ознакомьтесь с документацией по iOS, работающей с изображениями и экранами-заставкой на Центр разработки Windows.