.NET MAUI 11 がビルトインの LongPressGestureRecognizer を出荷
.NET MAUI 11 Preview 3 は LongPressGestureRecognizer を first-party のジェスチャーとして追加し、duration、移動しきい値、state イベント、command バインディングを備え、一般的な Community Toolkit の behavior を置き換えます。
今まで .NET MAUI で long press を検出するには、サードパーティの behavior、Community Toolkit の TouchBehavior に手を伸ばすか、OS ごとに platform handler を書く必要がありました。.NET MAUI 11 Preview 3 は、dotnet/maui #33432 経由で LongPressGestureRecognizer と共にパターンを first-party API に昇格させます。
すぐに得られるもの
新しい recognizer は TapGestureRecognizer、PanGestureRecognizer、そしてファミリーの残りの隣に座ります。実際の UI に重要な 4 つを公開します:
MinimumPressDurationはミリ秒で、デフォルトはプラットフォームの慣例 (Android で約 500ms、iOS で約 400ms) に従います。MovementThresholdはデバイス非依存単位で、ユーザーがそれを超えてドラッグするとジェスチャーをキャンセルします。スクロールが long press を発火しないためです。StateChangedイベントはStarted、Running、Completed、Canceledを報告し、触覚フィードバックや視覚的な押下状態に便利です。- MVVM バインディング用の
CommandとCommandParameter、そしてプレーンな code-behind 用のLongPressedイベント。
GestureRecognizers にぶら下がっているので、すでにジェスチャーを受け付けるあらゆる View が handler 変更なしで拾い上げます。
XAML で TouchBehavior を置き換える
アバター画像のコンテキストメニューは定型例です。.NET MAUI 10 では通常、LongPressCommand を持つ TouchBehavior が必要でした。.NET MAUI 11 ではこう折りたたまれます:
<Image Source="avatar.png"
HeightRequest="64"
WidthRequest="64">
<Image.GestureRecognizers>
<LongPressGestureRecognizer
MinimumPressDuration="650"
MovementThreshold="10"
Command="{Binding ShowContextMenuCommand}"
CommandParameter="{Binding .}" />
</Image.GestureRecognizers>
</Image>
recognizer は UI スレッドで dispatch し、バインドされたパラメータをまっすぐ通すので、view model はプラットフォーム非依存のままです。
press フィードバックのために state に反応する
StateChanged イベントはこれをネイティブっぽく感じさせるものです。ほとんどのプラットフォームの long press はホールド中にスケールをアニメートしたりターゲットを暗くしたりし、指が漂えばきれいにキャンセルします。新しい API ではそのロジックが 1 箇所に住みます:
var longPress = new LongPressGestureRecognizer
{
MinimumPressDuration = 500
};
longPress.StateChanged += async (s, e) =>
{
switch (e.State)
{
case GestureRecognizerState.Started:
await card.ScaleTo(0.97, 80);
break;
case GestureRecognizerState.Completed:
await HapticFeedback.Default.PerformAsync(HapticFeedbackType.LongPress);
await card.ScaleTo(1.0, 80);
ShowMenu();
break;
case GestureRecognizerState.Canceled:
await card.ScaleTo(1.0, 80);
break;
}
};
card.GestureRecognizers.Add(longPress);
この単一のイベントが 3 つの platform handler と MauiProgram に配線された Behavior を置き換えます。
ライブラリ作者になぜ重要か
以前自前の long-press 配管を出荷していたコントロールライブラリは、共有契約に依存できるようになりました。Microsoft.Maui.Controls の recognizer ならば、bindings、input transparency、そして IsEnabled の伝播がすでにフレームワークの残りと同じように動くので、消費者は CollectionView スクロール中にジェスチャーが発火するとか、親の InputTransparent="True" を尊重しないとかいった不整合に当たらなくなります。
まだ Community Toolkit の TouchBehavior を使っているなら、マイグレーションは通常 1 行の入れ替えとプロパティのリネームです。周辺のジェスチャーと XAML 変更については Preview 3 MAUI リリースノート 全体を確認してください。