スワイプ ジェスチャ認識エンジンを追加する
スワイプ ジェスチャが発生するのは、指が画面に沿って水平または垂直方向に動かされたときで、多くの場合コンテンツのナビゲーションを開始するために使われます。
View
にスワイプ ジェスチャを認識させるには、SwipeGestureRecognizer
インスタンスを作成し、Direction
プロパティに SwipeDirection
列挙値 (Left
、Right
、Up
、または Down
) を設定し、必要に応じて Threshold
プロパティを設定し、Swiped
イベントを処理して、新しいジェスチャ認識エンジンをビューの GestureRecognizers
コレクションに追加します。 次に示すコード例は、BoxView
に関連付けられている SwipeGestureRecognizer
です。
<BoxView Color="Teal" ...>
<BoxView.GestureRecognizers>
<SwipeGestureRecognizer Direction="Left" Swiped="OnSwiped"/>
</BoxView.GestureRecognizers>
</BoxView>
次に示すのは、同等の C# コードです。
var boxView = new BoxView { Color = Color.Teal, ... };
var leftSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Left };
leftSwipeGesture.Swiped += OnSwiped;
boxView.GestureRecognizers.Add(leftSwipeGesture);
SwipeGestureRecognizer
クラスには Threshold
プロパティも含まれています。このプロパティには、必要に応じて、スワイプが認識されるために必要な最小スワイプ距離を表す、デバイスに依存しない単位の uint
値を設定できます。 このプロパティの既定値は 100 で、これはデバイスに依存しない単位で 100 未満のスワイプは無視されることを意味します。
スワイプの方向を認識する
上の例では、Direction
プロパティに SwipeDirection
列挙型の 1 つの値が設定されています。 ただし、このプロパティに SwipeDirection
列挙型の複数の値を設定し、複数の方向のスワイプに対して Swiped
イベントが生成されるようにすることもできます。 ただし、1 つの SwipeGestureRecognizer
では同じ軸上で発生するスワイプしか認識できないという制約があります。 したがって、水平軸上で発生するスワイプは、Direction
プロパティに Left
と Right
を設定することによって認識できます。
<SwipeGestureRecognizer Direction="Left,Right" Swiped="OnSwiped"/>
同様に、垂直軸上で発生するスワイプは、Direction
プロパティに Up
と Down
を設定することによって認識できます。
var swipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Up | SwipeDirection.Down };
または、各スワイプ方向に対する SwipeGestureRecognizer
を作成すると、すべての方向のスワイプを認識することができます。
<BoxView Color="Teal" ...>
<BoxView.GestureRecognizers>
<SwipeGestureRecognizer Direction="Left" Swiped="OnSwiped"/>
<SwipeGestureRecognizer Direction="Right" Swiped="OnSwiped"/>
<SwipeGestureRecognizer Direction="Up" Swiped="OnSwiped"/>
<SwipeGestureRecognizer Direction="Down" Swiped="OnSwiped"/>
</BoxView.GestureRecognizers>
</BoxView>
次に示すのは、同等の C# コードです。
var boxView = new BoxView { Color = Color.Teal, ... };
var leftSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Left };
leftSwipeGesture.Swiped += OnSwiped;
var rightSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Right };
rightSwipeGesture.Swiped += OnSwiped;
var upSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Up };
upSwipeGesture.Swiped += OnSwiped;
var downSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Down };
downSwipeGesture.Swiped += OnSwiped;
boxView.GestureRecognizers.Add(leftSwipeGesture);
boxView.GestureRecognizers.Add(rightSwipeGesture);
boxView.GestureRecognizers.Add(upSwipeGesture);
boxView.GestureRecognizers.Add(downSwipeGesture);
Note
上の例では、Swiped
イベントの発生に対して同じイベント ハンドラーが応答します。 ただし、各 SwipeGestureRecognizer
インスタンスでは、必要に応じて、異なるイベント ハンドラーを使用できます。
スワイプに応答する
次の例では、Swiped
イベントに対するイベント ハンドラーを示します。
void OnSwiped(object sender, SwipedEventArgs e)
{
switch (e.Direction)
{
case SwipeDirection.Left:
// Handle the swipe
break;
case SwipeDirection.Right:
// Handle the swipe
break;
case SwipeDirection.Up:
// Handle the swipe
break;
case SwipeDirection.Down:
// Handle the swipe
break;
}
}
SwipedEventArgs
を調べることでスワイプの方向を特定し、必要に応じてカスタム ロジックでスワイプに応答できます。 スワイプの方向は、イベント引数の Direction
プロパティから取得できます。このプロパティには、SwipeDirection
列挙型の値のいずれかが設定されます。 さらに、イベント引数には Parameter
プロパティもあり、CommandParameter
プロパティ (定義されている場合) の値が設定されます。
コマンドを使用する
SwipeGestureRecognizer
クラスには、Command
プロパティと CommandParameter
プロパティも含まれています。 通常、これらのプロパティは、Model-View-ViewModel (MVVM) パターンを使用するアプリケーションで使用されます。 Command
プロパティではスワイプ ジェスチャが認識されたときに呼び出される ICommand
が定義されており、CommandParameter
プロパティでは ICommand.
プロパティに渡されるオブジェクトが定義されています。次のコード例では、インスタンスがページの BindingContext
として設定されているビュー モデルで定義されている ICommand
に Command
プロパティをバインドする方法が示されています。
var boxView = new BoxView { Color = Color.Teal, ... };
var leftSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Left, CommandParameter = "Left" };
leftSwipeGesture.SetBinding(SwipeGestureRecognizer.CommandProperty, "SwipeCommand");
boxView.GestureRecognizers.Add(leftSwipeGesture);
同等の XAML コードを次に示します。
<BoxView Color="Teal" ...>
<BoxView.GestureRecognizers>
<SwipeGestureRecognizer Direction="Left" Command="{Binding SwipeCommand}" CommandParameter="Left" />
</BoxView.GestureRecognizers>
</BoxView>
SwipeCommand
は、ページの BindingContext
として設定されているビュー モデルのインスタンスで定義されている ICommand
型のプロパティです。 スワイプ ジェスチャが認識されると、SwipeCommand
オブジェクトの Execute
メソッドが実行されます。 Execute
メソッドへの引数は、CommandParameter
プロパティの値です。 コマンドについて詳しくは、コマンド インターフェイスに関するページをご覧ください。
スワイプ コンテナーを作成する
次のコード例で示されている SwipeContainer
クラスは、スワイプ ジェスチャの認識を実行するために View
にラップされる一般化されたスワイプ認識クラスです。
public class SwipeContainer : ContentView
{
public event EventHandler<SwipedEventArgs> Swipe;
public SwipeContainer()
{
GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Left));
GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Right));
GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Up));
GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Down));
}
SwipeGestureRecognizer GetSwipeGestureRecognizer(SwipeDirection direction)
{
var swipe = new SwipeGestureRecognizer { Direction = direction };
swipe.Swiped += (sender, e) => Swipe?.Invoke(this, e);
return swipe;
}
}
SwipeContainer
クラスでは、4 つのスワイプ方向すべてに対して SwipeGestureRecognizer
オブジェクトが作成されて、Swipe
イベント ハンドラーが関連付けられます。 これらのイベント ハンドラーでは、SwipeContainer
によって定義されている Swipe
イベントが呼び出されます。
次に示すのは、BoxView
をラップしている SwipeContainer
クラスの XAML コード例です。
<ContentPage ...>
<StackLayout>
<local:SwipeContainer Swipe="OnSwiped" ...>
<BoxView Color="Teal" ... />
</local:SwipeContainer>
</StackLayout>
</ContentPage>
次に示すコードは、C# ページにおいて SwipeContainer
で BoxView
をラップする方法の例です。
public class SwipeContainerPageCS : ContentPage
{
public SwipeContainerPageCS()
{
var boxView = new BoxView { Color = Color.Teal, ... };
var swipeContainer = new SwipeContainer { Content = boxView, ... };
swipeContainer.Swipe += (sender, e) =>
{
// Handle the swipe
};
Content = new StackLayout
{
Children = { swipeContainer }
};
}
}
BoxView
がスワイプ ジェスチャを受け取ると、SwipeGestureRecognizer
で Swiped
イベントが生成されます。 これは SwipeContainer
クラスによって処理され、クラスで独自の Swipe
イベントが生成されます。 この Swipe
イベントは、ページで処理されます。 その後、SwipedEventArgs
を調べることでスワイプの方向を特定し、必要に応じてカスタム ロジックでスワイプに応答できます。