Dodawanie rozpoznawania gestów pan
Gest pan służy do wykrywania ruchu palców wokół ekranu i stosowania tego ruchu do zawartości i jest implementowany z klasą PanGestureRecognizer
. Typowym scenariuszem gestu panowania jest przesuwanie obrazu w poziomie i w pionie, dzięki czemu można wyświetlić całą zawartość obrazu, gdy jest ona wyświetlana w widoku mniejszym niż wymiary obrazu. Jest to realizowane przez przeniesienie obrazu w okienku wyświetlania i pokazano w tym artykule.
Aby element interfejsu użytkownika był przesuwany za pomocą gestu pan, utwórz PanGestureRecognizer
wystąpienie, obsłuż PanUpdated
zdarzenie i dodaj nowy moduł rozpoznawania gestów do GestureRecognizers
kolekcji w elemecie interfejsu użytkownika. Poniższy przykład kodu przedstawia PanGestureRecognizer
element dołączony do Image
elementu:
var panGesture = new PanGestureRecognizer();
panGesture.PanUpdated += (s, e) => {
// Handle the pan
};
image.GestureRecognizers.Add(panGesture);
Można to również osiągnąć w języku XAML, jak pokazano w poniższym przykładzie kodu:
<Image Source="MonoMonkey.jpg">
<Image.GestureRecognizers>
<PanGestureRecognizer PanUpdated="OnPanUpdated" />
</Image.GestureRecognizers>
</Image>
Kod programu OnPanUpdated
obsługi zdarzeń jest następnie dodawany do pliku za pomocą kodu:
void OnPanUpdated (object sender, PanUpdatedEventArgs e)
{
// Handle the pan
}
Tworzenie kontenera pan
Ta sekcja zawiera uogólnioną klasę pomocnika, która wykonuje przesuwanie dowolnych kształtów, co jest zwykle odpowiednie do nawigowania w obrębie obrazów lub map. Obsługa gestu pan w celu wykonania tej operacji wymaga pewnych obliczeń matematycznych w celu przekształcenia interfejsu użytkownika. Ta matematyka służy do przesuwania tylko w granicach opakowanego elementu interfejsu użytkownika. Poniższy przykład kodu przedstawia klasę PanContainer
:
public class PanContainer : ContentView
{
double x, y;
public PanContainer ()
{
// Set PanGestureRecognizer.TouchPoints to control the
// number of touch points needed to pan
var panGesture = new PanGestureRecognizer ();
panGesture.PanUpdated += OnPanUpdated;
GestureRecognizers.Add (panGesture);
}
void OnPanUpdated (object sender, PanUpdatedEventArgs e)
{
...
}
}
Tę klasę można opakować wokół elementu interfejsu użytkownika, aby gest przesunął opakowany element interfejsu użytkownika. Poniższy przykład kodu XAML przedstawia PanContainer
zawijanie Image
elementu:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:PanGesture"
x:Class="PanGesture.HomePage">
<ContentPage.Content>
<AbsoluteLayout>
<local:PanContainer>
<Image Source="MonoMonkey.jpg" WidthRequest="1024" HeightRequest="768" />
</local:PanContainer>
</AbsoluteLayout>
</ContentPage.Content>
</ContentPage>
Poniższy przykład kodu pokazuje, jak PanContainer
opakowuje Image
element na stronie języka C#:
public class HomePageCS : ContentPage
{
public HomePageCS ()
{
Content = new AbsoluteLayout {
Padding = new Thickness (20),
Children = {
new PanContainer {
Content = new Image {
Source = ImageSource.FromFile ("MonoMonkey.jpg"),
WidthRequest = 1024,
HeightRequest = 768
}
}
}
};
}
}
W obu przykładach WidthRequest
właściwości i HeightRequest
są ustawione na wartości szerokości i wysokości wyświetlanego obrazu.
Image
Gdy element otrzyma gest pan, wyświetlany obraz zostanie przesłonięty. Okienko jest wykonywane przez metodę PanContainer.OnPanUpdated
, która jest pokazana w poniższym przykładzie kodu:
void OnPanUpdated (object sender, PanUpdatedEventArgs e)
{
switch (e.StatusType) {
case GestureStatus.Running:
// Translate and ensure we don't pan beyond the wrapped user interface element bounds.
Content.TranslationX =
Math.Max (Math.Min (0, x + e.TotalX), -Math.Abs (Content.Width - App.ScreenWidth));
Content.TranslationY =
Math.Max (Math.Min (0, y + e.TotalY), -Math.Abs (Content.Height - App.ScreenHeight));
break;
case GestureStatus.Completed:
// Store the translation applied during the pan
x = Content.TranslationX;
y = Content.TranslationY;
break;
}
}
Ta metoda aktualizuje widoczną zawartość opakowanego elementu interfejsu użytkownika na podstawie gestu pan użytkownika. Jest to osiągane przy użyciu wartości TotalX
właściwości i TotalY
PanUpdatedEventArgs
wystąpienia, aby obliczyć kierunek i odległość patelni. Właściwości App.ScreenWidth
i App.ScreenHeight
zapewniają wysokość i szerokość widoku oraz są ustawiane na wartości szerokości ekranu i wysokości ekranu urządzenia według odpowiednich projektów specyficznych dla platformy. Opakowany element użytkownika jest następnie przesuwany przez ustawienie jego TranslationX
właściwości i TranslationY
na wartości obliczeniowe.
Podczas przesuwania zawartości w elemecie, który nie zajmuje pełnego ekranu, wysokość i szerokość widoku można uzyskać z właściwości i Width
elementuHeight
.
Uwaga
Wyświetlanie obrazów o wysokiej rozdzielczości może znacznie zwiększyć ilość pamięci aplikacji. W związku z tym należy je utworzyć tylko wtedy, gdy jest to wymagane i powinno zostać wydane natychmiast, gdy aplikacja nie będzie już ich wymagała. Aby uzyskać więcej informacji, zobacz Optymalizowanie zasobów obrazów.