Опубликован: 02.08.2013 | Доступ: свободный | Студентов: 464 / 16 | Длительность: 18:38:00
Специальности: Программист
Самостоятельная работа 15:

Сенсорный пользовательский интерфейс

Особенности взаимодействия с сенсорным экраном

Элементы управления, которыми мы пользовались до сих пор, позволяют обрабатывать стандартные варианты взаимодействия с ними с использованием обработчиков событий. Например, обработав событие Click кнопки можно задать реакцию системы на касание кнопки. Среди стандартных событий элементов управления можно обнаружить и другие события для обработки сенсорного ввода. Например, DoubleTap – для двойного касания, Hold – для удержания.

Состав событий, связанных с сенсорным экраном для конкретного элемента управления отражает специфику его использования. В то же время, среди этих событий нет, например, таких, как события, служащие для обработки сложных жестов. Например – жеста Flick, когда пользователь касается экрана, быстро проводит пальцем и, не останавливая движения, отрывает палец от экрана. Например – популярных жестов сжатия/растяжения (Pinch/Zoom) для масштабирования объектов.

Поддержку жестов можно реализовать самостоятельно, если обработать события ManipulationStarted (происходит при начале манипуляции), ManipulationDelta (происходит в процессе манипуляции, повторяется), и ManipulationCompleted (Происходит при завершении манипуляции). В проекте P15_1 использование манипуляций для перемещения окружности с градиентной заливкой по экрану показано на странице EventsAndGestures.xaml.

Кроме того, можно обработать низкоуровневые события, воспользовавшись классом TouchPoint.

Для того, чтобы упростить обработку жестов, можно воспользоваться библиотекой Windows Phone Toolkit – её можно подключить к проекту с помощью менеджера пакетов NuGet. Вот сайт проекта: http://phone.codeplex.com/. Найти библиотеку можно, введя в строку поиска запрос "wptoolkit". Эта библиотека, помимо набора элементов управления, предоставляет классы GestureService и GestureListener, предназначенные для обработки популярных жестов. В частности, поддерживаются следующие события:

  • GestureBegin – вызывается в начале касания
  • GestureCompleted – вызывается в конце касания
  • Tap – вызывается при выполнении жеста касания (палец касается экрана и быстро отрывается от экрана)
  • DoubleTap – вызывается при двойном касании экрана
  • Hold – вызывается при выполнении жеста удержания
  • DragStarted – вызывается в начале жеста перетаскивания
  • DragDelta – вызывается в процессе перетаскивания
  • DragCompleted – вызывается при окончании перетаскивания
  • Flick – вызывается когда пользователь касается экрана, быстро проводит пальцем и, не останавливая движения, отрывает палец от экрана
  • PinchStarted – вызывается в начале жеста сжатия/растяжения
  • PinchDelta – вызывается в процессе выполнения жеста сжатия/растяжения
  • PinchCompleted – вызывается в конце жеста сжатия/растяжения

Демонстрация обработки жестов Flick и Hold с помощью Windows Phone Toolkit сделана на примере прямоугольника на странице EventsAndGestures.xaml, рис. 45.3.

Объекты, воспринимающие жесты и манипуляции

увеличить изображение
Рис. 45.3. Объекты, воспринимающие жесты и манипуляции

Обратите внимание на то, как выглядит XAML-код страницы, на которой расположены элементы (Листинг 45.2). Здесь, во-первых, объявлено пространство имен toolkit. Во-вторых, для прямоугольника указаны обработчики событий Flick и Hold. По первому событию мы увеличиваем длину прямоугольника, по второму – сбрасываем прямоугольник в исходное состояние.

<phone:PhoneApplicationPage
    x:Class="P15_1.EventsGestures"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d"
    xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel содержит имя приложения и заголовок страницы-->
        <StackPanel Grid.Row="0" Margin="12,17,0,28">
            <TextBlock Text="СЕНСОРНЫЙ ВВОД" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock Text="жесты" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel – поместите здесь дополнительное содержимое-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Rectangle
                Fill="{StaticResource PhoneAccentBrush}" 
                HorizontalAlignment="Left" 
                Height="100" 
                Margin="147,109,0,0" 
                Stroke="Black" 
                VerticalAlignment="Top" 
                Width="100">
                <toolkit:GestureService.GestureListener>
                    <toolkit:GestureListener 
                        Flick="GestureListener_Flick"
                        Hold="GestureListener_Hold">

                    </toolkit:GestureListener>
                </toolkit:GestureService.GestureListener>
            </Rectangle>
            <TextBlock HorizontalAlignment="Left" Margin="24,25,0,0" TextWrapping="Wrap" 
Text="Жест скольжения для увеличеия размера, 
жест удержания - для возврата" VerticalAlignment="Top"/>
            <Ellipse x:Name="ellipseToDrag" HorizontalAlignment="Left" 
Height="100" Margin="147,399,0,0" Stroke="Black" 
VerticalAlignment="Top" Width="100" 
ManipulationDelta="Ellipse_ManipulationDelta">
                <Ellipse.Fill>
                    <RadialGradientBrush>
                        <GradientStop Color="#FFE51400" Offset="1"/>
                        <GradientStop Color="#FFF5F3F3"/>
                    </RadialGradientBrush>
                </Ellipse.Fill>
            </Ellipse>
            <TextBlock HorizontalAlignment="Left" Margin="24,299,0,0" TextWrapping="Wrap" 
Text="Эту фигуру можно перемещать" VerticalAlignment="Top"/>

        </Grid>
    </Grid>
</phone:PhoneApplicationPage>
Листинг 45.2. Код файла EventsGestures.xaml