Главная » Разработка для Windows Phone 7 » Библиотека фотографий телефона

0

Фотографии, сделанные при помощи телефона, и фотографии, загружаемые в телефон при синхронизации с ПК, формируют библиотеку фотографий телефона. Любое приложение, выполняющееся на телефоне, может работать с этой библиотекой двумя способами:

•         Для приложения класс PhotoChooserTask (Задача по выбору фотографии) во многом аналогичен CameraCaptureTask, только он обеспечивает доступ к библиотеке фотографий и предоставляет пользователю возможность выбрать одну фотографию, которая затем возвращается в приложение.

•         В пространстве имен XNA Microsoft.Xna.Framework.Media имеется класс MediaLibrary (Библиотека мультимедиа) и связанные классы, с помощью которых приложение может получать коллекции всех фотографий, хранящихся в библиотеке фотографий, и представлять их пользователю.

Рассмотрим эти два подхода на примере двух приложений. Просто для разнообразия (и чтобы продемонстрировать использование XNA-классов в приложении на Silverlight) первый подход реализуем на XNA и второй – на Silverlight.

Обе эти программы можно выполнять на эмуляторе телефона. Эмулятор включает небольшую коллекцию фотографий, которая предусмотрена специально для целей тестирования. Однако в случае тестирования приложений на телефоне он должен быть отключен от ПК, или ПО Zune должно быть закрыто, поскольку оно не допустит одновременного доступа еще одного приложения к библиотеке фотографий телефона. Закрыв Zune, запускайте WPDTPTConnect32.exe или WPDTPTConnect64.exe, которое позволяет Visual Studio проводить отладку приложения, выполняющегося на телефоне.

В приложении XnaTapToBrowse необходимо подключить пространство имен Microsoft.Phone.Tasks посредством директивы using. Это позволит создать объект PhotoChooserTask и другие поля:

Проект Silverlight: XnaTapToBrowse Файл: Game1.cs (фрагмент, демонстрирующий поля)

public class Game1 : Microsoft.Xna.Framework.Game {

GraphicsDeviceManager graphics; SpriteBatch spriteBatch; Texture2D texture;

PhotoChooserTask photoChooser = new PhotoChooserTask();

}

Соответственно рекомендациям документации этот класс прикрепляет событие Completed к конструктору:

Проект Silverlight: XnaTapToBrowse Файл: Game1.cs (фрагмент)

public Game1() {

graphics = new GraphicsDeviceManager(this);

Content.RootDirectory = "Content";

// По умолчанию для Windows Phone частота кадров составляет 30 кадр/с. TargetElapsedTime = TimeSpan.FromTicks(333333);

TouchPanel.EnabledGestures = GestureType.Tap; photoChooser.Completed += OnPhotoChooserCompleted;

}

Как обычно, метод Update проводит проверку на наличие пользовательского ввода. В случае касания он инициирует событие Show объекта PhotoChooserTask:

Проект Silverlight: XnaTapToBrowse Файл: Game1.cs (фрагмент)

protected override void Update(GameTime gameTime) {

// Обеспечиваем возможность выхода из игры

if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit();

while (TouchPanel.IsGestureAvailable)

if (TouchPanel.ReadGesture().GestureType == GestureType.Tap) photoChooser.Show();

base.Update(gameTime);

}

void OnPhotoChooserCompleted(object sender, PhotoResult args) {

if (args.TaskResult == TaskResult.OK)

texture = Texture2D.FromStream(this.GraphicsDevice, args.ChosenPhoto);

}

После этого обработчик события Completed из потока, доступного из свойства ChosenPhoto (Выбранная фотография), создает Texture2D. Пока этот объект недоступен, перегруженный метод Draw не делает попыток сформировать его визуальное представление:

Проект Silverlight: XnaTapToBrowse Файл: Game1.cs (фрагмент)

protected override void Draw(GameTime gameTime) {

GraphicsDevice.Clear(Color.Navy);

if (texture != null) {

spriteBatch.Begin();

spriteBatch.Draw(texture, this.GraphicsDevice.Viewport.Bounds, Color.White); spriteBatch.End();

}

base.Draw(gameTime);

}

В данном случае метод Draw в SpriteBatch немного изменен. Во втором аргументе вместо координат Texture2D возвращается прямоугольник, размер которого равен размеру окна просмотра. Это обусловливает изменение размеров фотографии, что весьма вероятно приведет к ее искажению, поскольку пропорции исходного изображения не учитываются. Безусловно, это решаемые проблемы, но они требуют более сложного кода.

В приложение SilverlightAccessLibrary необходимо включить ссылку на библиотеку Microsoft.Xna.Framework DLL. При этом, скорее всего, появится предупреждение о включении библиотеки XNA в приложение на Silverlight. Ничего страшного! Область содержимого файла MainPage.xaml включает Grid с Image и TextBlock:

Проект Silverlight: SilverlightAccessLibrary Файл: MainPage.xaml (фрагмент)

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Image Name="img" />

<TextBlock Name="txtblk"

TextWrapping="Wrap" TextAlignment="Center" VerticalAlignment="Bottom" />

</Grid>

Данное приложение не будет представлять пользователю всю библиотеку фотографий (реализовать эту задачу с помощью лишь рассмотренных нами до сих пор неполнофункциональных элементов компоновки Silverlight довольно сложно). В данном случае одна фотография будет выбираться случайным образом, и другая – по касанию пользователем экрана:

Проект Silverlight: SilverlightAccessLibrary Файл: MainPage.xaml.cs (фрагмент)

public partial class MainPage : PhoneApplicationPage {

MediaLibrary mediaLib = new MediaLibrary(); Random rand = new Random();

public MainPage() {

InitializeComponent(); GetRandomPicture();

}

protected override void OnManipulationStarted(ManipulationStartedEventArgs args) {

GetRandomPicture(); args.Complete();

base.OnManipulationStarted(args);

}

void GetRandomPicture() {

PictureCollection pictures = mediaLib.Pictures;

if (pictures.Count > 0) {

int index = rand.Next(pictures.Count); Picture pic = pictures[index];

BitmapImage bmp = new BitmapImage(); bmp.SetSource(pic.GetImage()); img.Source = bmp;

txtblk.Text = String.Format("{0}\n{1}\n{2}",

pic.Name, pic.Album.Name, pic.Date);

}

}

Экземпляр XNA-класса MediaLibrary создан как поле. Метод GetRandomPicture (Возвратить случайный рисунок) получает объект PictureCollection (Коллекция рисунков) из класса MediaLibrary и случайным образом выбирает одно изображение. Метод GetImage (Возвратить изображение) объекта Picture (Рисунок) возвращает поток и данные Name, Album (Альбом) и Data (Сведения), отображаемые приложением в TextBlock.

Приложения для Windows Phone 7 может также сохранять растровое изображение в библиотеку. Все сохраняемые растровые изображения размещаются в специальном альбоме под названием Saved Pictures (Сохраненные рисунки). Как это реализовывается, будет рассмотрено в главах 14 и 22.

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии