Maui: 【仕様】トランジション

作成日 2020年05月18日  ·  7コメント  ·  ソース: dotnet/maui

トランジション

マウイにはすでに完全なアニメーションAPIがあり、ページ上にライブで流動的なコンテンツを作成できます。 ただし、ページ間を移動するとどうなりますか?

この仕様は、マウイトランジションAPIを定義してい

  • 従来のトランジション:従来、異なるページ間のトランジションには、ビュー階層全体を互いに独立してアニメーション化する開始トランジションと終了トランジションが含まれていました。
  • 共有要素の遷移:多くの場合、両方のアクティビティに共通の要素があり、これらの共有要素を個別に遷移する機能を提供することで、遷移間の連続性が強調され、ユーザーがアプリをナビゲートするときにアクティビティの境界が破られます。

shared_transitions

API

従来の移行

従来のトランジションの場合、サポートされているトランジションを含む新しい列挙が必要です。

public enum NavigationTransitionType
{
    None,
    Fade,
    Flip,
    Scale,
    SlideFromLeft,
    SlideFromRight,
    SlideFromTop,
    SlideFromBottom,
    Turnstile
}

また、NavigationPageとShellを使用してページを遷移できるように、ページに新しいプロパティを含めます。

  • TransitionType :使用される遷移効果。
  • TransitionDuration :ミリ秒単位の遷移期間。
public static readonly BindableProperty TransitionTypeProperty =
     BindableProperty.Create(nameof(TransitionType), typeof(NavigationTransitionType),   typeof(NavigationPage), PageTransitionType.None,
     BindingMode.TwoWay, null);

public NavigationTransitionType TransitionType
{
    get { return (NavigationTransitionType)GetValue(TransitionTypeProperty); }
    set { SetValue(TransitionTypeProperty, value); }
}

public static readonly BindableProperty TransitionDurationProperty =
     BindableProperty.Create(nameof(TransitionDuration), typeof(double), typeof(NavigationPage), 500d,
     BindingMode.TwoWay, null);

public double TransitionDuration
{
    get { return (double)GetValue(TransitionDurationProperty); }
    set { SetValue(TransitionDurationProperty, value); }
}

共有要素の遷移

一方、共有要素の遷移を許可する方法が必要です。 重要なのは、2つの異なるページで利用可能な同じアイテムを「リンク」する方法です。

Viewから継承されたサポートされている要素にTransitionTag添付プロパティがあります。

public static readonly BindableProperty TransitionTagProperty =    
     BindableProperty.CreateAttached("TransitionTag", typeof(int), typeof(Transition), 0,
propertyChanged: OnPropertyChanged);

用途は次のとおりです。

<Image Source="xamarin.jpg" TransitionTag="logo" WidthRequest="100" />

ソースページで遷移するコントロールにタグを付けます。

<Image Source="xamarin.jpg" TransitionTag="logo" WidthRequest="300" />

そして、宛先ページで遷移するコントロールにタグを付けます。

シナリオ

いくつかの例を見てみましょう。

XAMLの例

ページ間の遷移を使用したサンプル:

<ContentPage
     TransitionType=“SlideFromBottom”
     TransitionDuration="750" />

共有遷移要素を使用したサンプル:

ページ1:

<Image  
     Source="xamagon_preview.png"
     TransitionTag="xamagon"/>

2ページ:

<Image  
     Source="xamagon.png"
     TransitionTag="xamagon"/>

ノート

  • トランジションを表示するには、ソースページと宛先ページのTransitionTagが一致している必要があります。
  • 一度に複数のビューをアニメーション化できますが、ページ内のすべてのTransitionTagは一意である必要があります。

難易度:中

animation 🎬 enhancement proposal-open

最も参考になるコメント

共有トランジションに関しては、アイテムのリスト(たとえば、Collectionview)からトランジションを作成する場合、「TransitionTag」プロパティでは、アニメーション化するビューを識別するのに十分ではないことに注意してください。

画像とテキストを含むアイテムのリストを含むDataTemplateを想像してみてください。すべての画像は異なりますが、TransitionTagは常に同じです(例: "ImageToTransition")。

要素をタップするとき、ナビゲーションレンダラーは、どの要素を翻訳する必要があるかを正確に知る必要があります。CollectionView内のすべての画像に単一のタグがある場合、これは問題になる可能性があります。

私のプラグインでは、翻訳する要素を識別するために使用するTransitionGroupプロパティを使用して解決しました。

この機能に貢献したいのですが、Android用のコードは十分に安定していません(TabbedPages / MasterPageを使用するとChildFragmentsに問題がありますが、シェルでは問題ないと思います)、iOSでもいくつかのハックを使用して適切なトランジションシェイプを作成します。

私は最初のバージョンから多くのコードを作り直し、今では見栄えが良くなっていますが、コアに入るのに十分ではないと思いますが、必要に応じて支援し、貢献する準備ができています
https://github.com/GiampaoloGabba/Xamarin.Plugin.SharedTransitions

全てのコメント7件

提案

おそらく、 enum代わりにアニメーションを受け取るプロパティですか?
ITransitionAnimationインターフェイスを実装する必要があるカスタマイズされたアニメーションを拡張および受信できるようにするため。
そして、フォントでNamedSizeように使用するいくつかの事前定義されたアニメーション

例:

<ContentPage
     Transition=“{local:MyCustomTransition}"
     TransitionDuration="750" />

または事前定義された「名前付きトランジション」

<ContentPage
     Transition=“Fade"
     TransitionDuration="750" />

共有トランジションに関しては、アイテムのリスト(たとえば、Collectionview)からトランジションを作成する場合、「TransitionTag」プロパティでは、アニメーション化するビューを識別するのに十分ではないことに注意してください。

画像とテキストを含むアイテムのリストを含むDataTemplateを想像してみてください。すべての画像は異なりますが、TransitionTagは常に同じです(例: "ImageToTransition")。

要素をタップするとき、ナビゲーションレンダラーは、どの要素を翻訳する必要があるかを正確に知る必要があります。CollectionView内のすべての画像に単一のタグがある場合、これは問題になる可能性があります。

私のプラグインでは、翻訳する要素を識別するために使用するTransitionGroupプロパティを使用して解決しました。

この機能に貢献したいのですが、Android用のコードは十分に安定していません(TabbedPages / MasterPageを使用するとChildFragmentsに問題がありますが、シェルでは問題ないと思います)、iOSでもいくつかのハックを使用して適切なトランジションシェイプを作成します。

私は最初のバージョンから多くのコードを作り直し、今では見栄えが良くなっていますが、コアに入るのに十分ではないと思いますが、必要に応じて支援し、貢献する準備ができています
https://github.com/GiampaoloGabba/Xamarin.Plugin.SharedTransitions

ところで、いくつかのプロパティをメインコアに統合できれば、私のコードの多くは大幅に簡素化される可能性があります

@felipebaltazar TabViewでカスタムトランジションを作成するという提案に似ている可能性がありますhttps://github.com/xamarin/Xamarin.Forms/issues/10773いくつかのテストを行い、その後、仕様を確認します。

@GiampaoloGabbaこのAPIに関するフィードバックがあることは間違いなく素晴らしいことです。 Xamarin.Formsのように貢献したい場合は、PRを受け付け、喜んでお手伝いします。 あなたがコレクションに指定するパラメータについて、私はそれをレビューしました、そしてあなたは正しいです。 Mnn、これらのケースをカバーするためにプロパティを追加することができます( TransitionGroup )。または、要素の親がコレクションである場合は内部的に、グループを自動的に作成します。

または、要素の親がコレクションである場合は内部的に、グループを自動的に作成します。

私はこのアプローチを試しましたが、少し難しかったです。 たとえば、コレクションビューでは、SelectedItemの変更に基づいてナビゲーションを開始できます。
グループ化のためにプロパティを「平手打ち」して、ユーザーがいつどのように使用するかを決定できるようにする方がはるかに簡単でした:)

ところで、私はこれを開発するために使用した基本アーキテクチャをカバーする小さなドキュメントをここに書くことを計画しています(遷移を追跡する方法とiOSでそれを実現する方法、それに対するネイティブサポートがなく、すべてを手作業で開発する必要があったため) 、Androidでははるかに簡単ですが、tappedpageとMasterDetailによって生成された子フラグメントを除外すると)

ここに移植して悪いアイデアを除外するための良いアイデアがあるかもしれない場合に備えて、きっとたくさんあるでしょう:)

いいです

@felipebaltazar TabView xamarin / Xamarin.Forms#10773でカスタムトランジションを作成するという提案に似ている可能性があります。いくつかのテストを行い、その後、仕様を確認します。

いいですね!!!!
Xamarin.Forms.Skeletonリポジトリでいくつかのアニメーションを作成しましたが、新しいアイデアに役立つかもしれません...わかりません...

https://github.com/HorusSoftwareUY/Xamarin.Forms.Skeleton

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

Yaroslav08 picture Yaroslav08  ·  6コメント

ghost picture ghost  ·  7コメント

sim756 picture sim756  ·  16コメント

adojck picture adojck  ·  15コメント

handicraftsman picture handicraftsman  ·  4コメント