web-dev-qa-db-ja.com

FEATURE_ACTIVITY_TRANSITIONSとFEATURE_CONTENT_TRANSITIONSの比較

これら2つのフラグ Window の違いを理解するのに問題があり、それぞれを使用する必要がある場合とその理由が100%確実ではありません。

_Window.FEATURE_ACTIVITY_TRANSITIONS_ のドキュメントは次のように言います:

makeSceneTransitionAnimation(Activity, Pair[])またはmakeSceneTransitionAnimation(Activity, View, String)で作成されたActivityOptionsバンドルを送信または受信して、アクティビティがアクティビティ遷移を実行できるようにします。

そして _Window.FEATURE_CONTENT_TRANSITIONS_ のドキュメントはこう言います:

ウィンドウコンテンツの変更がTransitionManagerを使用してアニメーション化されることを要求するためのフラグ。

TransitionManagersetTransitionManager(TransitionManager)を使用して設定されます。何も設定されていない場合、デフォルトのTransitionManagerが使用されます。

ドキュメントには、次の Window メソッドには_FEATURE_ACTIVITY_TRANSITIONS_フラグを有効にする必要があると記載されていますが、_FEATURE_CONTENT_TRANSITIONS_を有効にする必要があるかどうかについては何も述べていません。よく( ソースコード によると、_FEATURE_ACTIVITY_TRANSITIONS_はtrueであり、_FEATURE_CONTENT_TRANSITIONS_はマテリアルをテーマとするアプリケーションのデフォルトではfalseです) :

  • get{Enter,Exit,Return,Reenter}Transition()
  • set{Enter,Exit,Return,Reenter}Transition()
  • getSharedElement{Enter,Exit,Return,Reenter}Transition()
  • setSharedElement{Enter,Exit,Return,Reenter}Transition()
  • getTransitionBackgroundFadeDuration()
  • setTransitionBackgroundFadeDuration()

つまり、この情報に基づくと、_FEATURE_ACTIVITY_TRANSITIONS_はLollipopの新しいActivity Transition APIを使用するためにアプリケーションが有効にする必要がある機能フラグです。しかし、私を混乱させるのは この記事 Android Developersサイトからの引用ですが、カスタムアクティビティ遷移を実装するには_FEATURE_CONTENT_TRANSITIONS_を有効にする必要があると述べています。

だからここに私の質問があります:

  1. これら2つのフラグの違いは何ですか?このコンテキストでの「アクティビティ遷移」と「コンテンツ遷移」の違いは何ですか?
  2. デフォルトで_FEATURE_ACTIVITY_TRANSITIONS_が有効で_FEATURE_CONTENT_TRANSITIONS_が無効になっているのはなぜですか? _FEATURE_CONTENT_TRANSITIONS_フラグを有効にする必要があるのはいつですか?
  3. _FEATURE_ACTIVITY_TRANSITIONS_を無効にして_FEATURE_CONTENT_TRANSITIONS_を有効にすることは理にかなっていますか?または、_FEATURE_CONTENT_TRANSITIONS_も_FEATURE_ACTIVITY_TRANSITIONS_を有効にする必要がありますか?

ありがとう!

44
Alex Lockwood

ドキュメントが明確ではないため、これらの質問に答える機会を得られてうれしいです。

初期には、両方の機能を処理する1つのフラグFEATURE_CONTENT_TRANSITIONSがありました。有効にしたときにMaterialアプリケーションが予期しない動作をしたときに、それらを分割します。そのため、一部の古いドキュメントでは、FEATURE_CONTENT_TRANSITIONSを意味する場合、アクティビティの遷移を取得するにはFEATURE_ACTIVITY_TRANSITIONSを有効にする必要があるとまだ記載されている場合があります。

  1. これら2つのフラグの違いは何ですか?このコンテキストでの「アクティビティ遷移」と「コンテンツ遷移」の違いは何ですか?

このコンテキストでのアクティビティ遷移は、ActivityOptions.makeSceneTransitionAnimationから作成されたバンドルを使用してstartActivityを呼び出すか、またはアクティビティがそのバンドルで開始されたことを意味します。アクティビティ遷移はレイアウトを変更するため(たとえば、要素のフェードイン、共有要素の移動など)、アクティビティが気に入らない場合は、FEATURE_ACTIVITY_TRANSITIONSを無効にする必要があります。

コンテンツ遷移では、TransitionManagerを呼び出すときにsetContentViewを使用します(初回以外)。通常、クロスフェードが発生しますが、アクティビティのコンテンツにIDの共有やtransitionNameの使用などの共通点がある場合、それらのビュー間でChangeBoundsの動作が得られます。 XMLまたはコードを使用して、ウィンドウに関連付けられているTransitionManagerをカスタマイズすることにより、遷移の詳細を変更できます。

  1. デフォルトでFEATURE_ACTIVITY_TRANSITIONSが有効になっていてFEATURE_CONTENT_TRANSITIONSが無効になっているのはなぜですか?実際にFEATURE_CONTENT_TRANSITIONSフラグを有効にする必要があるのはいつですか?

FEATURE_CONTENT_TRANSITIONSは、コンテンツが変更されたときにTransitionManagerを使用します。デフォルトでは、これはクロスフェードであり、一部のアプリケーションでは非常に悪かった。一方、FEATURE_ACTIVITY_TRANSITIONSはデフォルトでほとんどのアプリケーションに対して何もしません。その方法でアクティビティを開始することを選択する必要があるので、オンにしても安全です。

  1. FEATURE_ACTIVITY_TRANSITIONSを無効にしてFEATURE_CONTENT_TRANSITIONSを有効にすることは理にかなっていますか?または、FEATURE_CONTENT_TRANSITIONSではFEATURE_ACTIVITY_TRANSITIONSも有効にする必要がありますか?

はい、可能性は低いです。アプリケーションがFEATURE_CONTENT_TRANSITIONSを気に入っている場合は、FEATURE_ACTIVITY_TRANSITIONSでも問題なく機能するはずです。共有要素を使用してユーザーがアクティビティを呼び出せないように明示的に制限する場合、または標準の開始遷移効果が気に入らない場合は、それを無効にして、他のアプリケーションが呼び出されたときの効果を防​​ぐことができます。

46
George Mount