Přidání rozpoznávání gest posouvání
Gesto posouvání se používá k detekci pohybu prstů po obrazovce a použití tohoto pohybu na obsah a je implementována s PanGestureRecognizer
třídou. Běžným scénářem gesta posouvání je vodorovné a svislé posouvání obrázku, aby se veškerý obsah obrázku mohl zobrazit, když se zobrazuje v oblasti zobrazení menší než rozměry obrázku. Toho se dosahuje přesunutím obrázku v rámci oblasti zobrazení a je to znázorněno v tomto článku.
Pokud chcete, aby byl prvek uživatelského rozhraní pohybitelný gestem posouvání, vytvořte PanGestureRecognizer
instanci, zpracujte PanUpdated
událost a přidejte do kolekce na prvek uživatelského rozhraní nový rozpoznávání GestureRecognizers
gest. Následující příklad kódu ukazuje připojenou PanGestureRecognizer
k elementu Image
:
var panGesture = new PanGestureRecognizer();
panGesture.PanUpdated += (s, e) => {
// Handle the pan
};
image.GestureRecognizers.Add(panGesture);
Toho lze dosáhnout také v xaml, jak je znázorněno v následujícím příkladu kódu:
<Image Source="MonoMonkey.jpg">
<Image.GestureRecognizers>
<PanGestureRecognizer PanUpdated="OnPanUpdated" />
</Image.GestureRecognizers>
</Image>
Kód obslužné OnPanUpdated
rutiny události se pak přidá do souboru kódu za kódem:
void OnPanUpdated (object sender, PanUpdatedEventArgs e)
{
// Handle the pan
}
Vytvoření kontejneru posouvání
Tato část obsahuje generalizovanou pomocnou třídu, která provádí volné posouvání, což je obvykle vhodné pro navigaci v obrázcích nebo mapách. Zpracování gesta posouvání k provedení této operace vyžaduje k transformaci uživatelského rozhraní určitou matematiku. Tato matematika se používá k posouvání pouze v mezích zabaleného prvku uživatelského rozhraní. Následující příklad kódu ukazuje PanContainer
třídu:
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)
{
...
}
}
Tato třída může být zabalena kolem prvku uživatelského rozhraní, aby gesto posunut zabalený prvek uživatelského rozhraní. Následující příklad kódu XAML ukazuje zabalení elementu PanContainer
Image
:
<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>
Následující příklad kódu ukazuje, jak PanContainer
zalamuje Image
prvek na stránce jazyka 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
}
}
}
};
}
}
V oboupříkladch WidthRequest
HeightRequest
Image
Když prvek obdrží gesto posouvání, zobrazí se zobrazený obrázek. Pan se provádí metodou PanContainer.OnPanUpdated
, která je znázorněna v následujícím příkladu kódu:
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;
}
}
Tato metoda aktualizuje zobrazitelný obsah zabaleného prvku uživatelského rozhraní na základě gesta posouvání uživatele. Toho dosáhnete pomocí hodnot TotalX
a TotalY
vlastností PanUpdatedEventArgs
instance k výpočtu směru a vzdálenosti posunu. App.ScreenHeight
Vlastnosti App.ScreenWidth
poskytují výšku a šířku oblasti zobrazení a jsou nastaveny na šířku obrazovky a výšku obrazovky zařízení příslušnými projekty specifickými pro platformu. Zabalený prvek uživatele se pak posune nastavením jeho TranslationX
a TranslationY
vlastností na počítané hodnoty.
Při posouvání obsahu v prvku, který nezabývá celou obrazovku, lze výšku a šířku oblasti zobrazení získat z prvků Height
a Width
vlastností.
Poznámka:
Zobrazení obrázků s vysokým rozlišením může výrazně zvýšit nároky na paměť aplikace. Proto by se měly vytvořit pouze v případě potřeby a měly by být vydány, jakmile je aplikace už nevyžaduje. Další informace naleznete v tématu Optimalizace prostředků image.