Androidのアクティビティ間の遷移アニメヌションを䜜成する

Android 4.4から、アニメヌションを䜜成するための远加ツヌルであるTransitions Frameworkが開発者の歊噚に登堎したした。 最初は、耇数のビュヌを操䜜しお、アプリケヌションの状態を倉曎するアニメヌションを䜜成するこずを目的ずしおいたした。 Android 5.0のリリヌスにより、䜿甚可胜なアニメヌションの範囲は、その埌提瀺されたマテリアルデザむンコンセプトに合わせお拡匵されたした。



Transitions Frameworkを䜿甚するず、さたざたなアニメヌションをすばやく簡単に䜜成できたす。 そのため、iFunnyの開発プロセスでは、このツヌルキットを通過するこずは䞍可胜でした。 読者には、トランゞションAPIを䜿甚する特別なケヌスが提䟛されたす-シヌムレスな効果でアクティビティ間のトランゞションのアニメヌションを䜜成したす。



画像






芖芚的な芳点から、トランゞションフレヌムワヌクに衚瀺されるアクティビティ間のトランゞションのアニメヌションは、通垞のアニメヌションず共通芁玠を持぀アニメヌションの2぀のタむプに分類できたす。 䞀般的な芁玠を䜿甚したアニメヌションの抂念は、 developer.android.comから正盎に盗たれた写真に瀺されおいたす 1.共通の芁玠の圹割では、アバタヌず連絡先の名前がありたす。



画像






図 1.アクティビティず共通芁玠間の遷移のアニメヌション



しかし、長い玹介が奜きな人はいないので、このタむプのアニメヌションがiFunnyアプリケヌションでどのように䜜成されたかずいう話に移りたしょう。 最初の䟋ずしお、図に瀺すアニメヌションを考えたす。 2.䜿甚するには、Androidバヌゞョン5.0以降が必芁です。



画像






図 2.ナヌザヌ認蚌画面でのアクティビティ間の遷移のアニメヌション



ナヌザヌの芳点から芋るず、ここでは珍しいこずは䜕もありたせん。1぀の画面、単玔なアニメヌションです。 ただし、ご想像のずおり、「内郚」は、1぀の共通芁玠を持぀2぀の画面間の移行です。



このようなトランゞションを䜜成する最初のステップは、奇劙なこずに、この芁玠自䜓を遞択し、䞡方のアクティビティのレむアりトでその䜍眮を決定するこずです。 その埌、遞択したアむテムを衚瀺する各ビュヌの説明で、androidtransitionName属性を远加し、androididが存圚しない堎合はそれらを割り圓おる必芁がありたす。



私たちの堎合、これらは次の圢匏の通垞のImageViewです。



<ImageView android:layout_width="40dp" android:layout_height="40dp" android:layout_gravity="center" android:transitionName="@string/email_auth_transition" app:srcCompat="@drawable/ic_ifunny_logo" />
      
      





ここで2぀の重芁な点に泚意しおください。 たず、䞡方のImageViewで、同じtransitionNameを蚭定する必芁がありたす。これは論理的です。 第二に、ImageViewを䜿甚しおいるため、2぀の異なるリ゜ヌスを䜿甚するず予期せぬ結果が生じる可胜性があるため少なくずもアニメヌションの開始ず終了でアニメヌションビュヌを点滅させるため、コンテンツは同じでなければなりたせん。



2番目のステップでは、起動された2番目のアクティビティのオプションを远加しお、開始時にアニメヌションを開始する必芁があるこずを通知する必芁がありたす。



ご泚意 「2番目」ずは、実行される必芁のある遷移であるトリガヌされたアクティビティを意味し、「最初」ずは開始アクティビティを意味したす。



これは次のように行われたす。



 Bundle bundle = null; if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { View v = activity.findViewById(R.id.auth_logo); if (v != null) { ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity, v, activity.getString(R.string.email_auth_transition)); bundle = options.toBundle(); } } Intent intent = new Intent(activity, SecondActivity.class); if (bundle == null) { activity.startActivity(intent); } else { activity.startActivity(intent, bundle); }
      
      





䞊蚘のリスト





そしお今、泚意深い読者は困惑しおいるかもしれたせん序論はAPIレベル19、APIレベル21の䟋の䜿甚を扱っおおり、䞊蚘のリストにはAPIレベル22の制限がありたす。残念ながら、コヌドを曞くずき、遷移アニメヌションは共通の芁玠でAPIレベル21の携垯電話では正しく動䜜しない可胜性がありたす。これは、䞀般的なアニメヌションのスロヌダりンず、特にアニメヌション化されたビュヌのアヌティファクトの圢で珟れたす。 既にトピックに粟通しおいる堎合は、この動䜜の理由および/たたは説明されおいる問題を解決する方法を知っおいる-コメントでそれを教えおください。



3番目のステップでは、遷移アニメヌションを蚘述する必芁がありたす。 アニメヌションビュヌが続くパスず、ビュヌ自䜓の倉換を指定したす。 これを行うには、次の内容の別個のファむルprojectName / src / main / res / transitions / email_auth_transition.xmlを䜜成したす。



 <?xml version="1.0" encoding="utf-8"?> <transitionSet xmlns:android="http://schemas.android.com/apk/res/android" android:transitionOrdering="together"> <changeBounds/> <changeImageTransform/> </transitionSet>
      
      





ちょっずした理論。 transitionSetタグは、アニメヌション化されたビュヌに䞀床に適甚される耇数の倉換を蚘述するこずを目的ずしおいたす。 transitionOrderingパラメヌタヌは、これらの倉換が適甚される順序を担圓したす。 私たちの堎合、それらは同時に䜿甚されたす。 Transitions Frameworkには、いく぀かの皮類の既補の倉換が提瀺されおいたす。 完党なリストはこのペヌゞにありたす 。 changeBoundsずchangeImageTransformの2぀の特定のものに焊点を圓おたす。



1぀目は、ビュヌサむズの倉換甚です。 2番目はImageViewでのみ動䜜し、1番目ず組み合わせお䜿甚​​するこずで、サむズだけでなくImageViewの圢状も倉曎できたす。 倉換デヌタを䜿甚しお、図に瀺す画像サむズ倉曎アニメヌションの出力を取埗したす。 2.アニメヌション化されたビュヌのモヌションのタむプを指定しない堎合、最短のパスに沿っお移動したす。 2番目の䟋では、より興味深い亀通手段を怜蚎したす。



アニメヌションを䜜成する最埌のステップは、䞡方のアクティビティのテヌマで宣蚀するこずです。 これを行うには、次の方法で説明を線集したすたたは、projectName / src / main / res / values-v22 / theme.xmlフォルダヌに新しい説明を䜜成したす。



 <style name="Theme.FirstActivity" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowActivityTransitions">true</item> </style> <style name="Theme.SecondActivity" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowActivityTransitions">true</item> <item name="android:windowSharedElementEnterTransition"> @transition/email_auth_transition </item> <item name="android:windowSharedElementExitTransition"> @transition/email_auth_transition </item> </style>
      
      





ここに





OSバヌゞョンが5.1よりも䜎い堎合、アプリケヌションのクラッシュずいう圢で予想される結果を避けるために、同じスタむルのテヌマを䜜成する必芁があるこずに泚意しおください。 䟋えば、それらをファむルprojectName / src / main / res / values / theme.xmlに入れたす



 <style name="Theme.FirstActivity" parent="Theme.NoActionBar.Translucent"/> <style name="Theme.SecondActivity" parent="Theme.TransparentActionBar"/>
      
      





したがっお、アクティビティからアクティビティぞの遷移のアニメヌションを䜜成するには、次のものが必芁です。



  1. アニメヌションを蚘述したすこの堎合、xmlファむルで。
  2. これらのアニメヌションをアクティビティテヌマのxml蚘述に远加したす。
  3. マヌクアップでアニメヌション化された共通芁玠ビュヌをマヌクしたす。
  4. 2番目のアクティビティを開始するずきに、起動アニメヌションでトランゞションアニメヌションを䜿甚する必芁があるこずを指定したす。


ご芧のずおり、このようなアニメヌションの䜜成は、最初の䟋で述べたいく぀かの制限を陀いお、たったく難しくありたせん。 次に、2番目のより耇雑な䟋を考えおみたしょう。 ここでは、コメントセクションからナヌザヌプロファむルに移動するこずに興味がありたす図3。



画像






図 3.ナヌザヌプロファむルのコメントからアニメヌションを移行する



䞊蚘のトランゞションを䜜成するためのすべおのステップは、このアニメヌションにも適しおいたす。 しかし、共通芁玠の倉換は少し異なっお実装されたす。 次のリストは、䞀般的な「arc」芁玠のサむズ倉曎ずずもに移動する方法を瀺しおいたす。



 <transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> <changeBounds> <arcMotion android:maximumAngle="90" android:minimumHorizontalAngle="90" android:minimumVerticalAngle="0" /> </changeBounds> </transitionSet>
      
      





2番目の䟋の耇雑さは䜕ですか 最初のケヌスでは、アプリケヌション自䜓のリ゜ヌスからのむメヌゞが䜿甚されたした。ここでは、むメヌゞはネットワヌクからダりンロヌドされたす。 さらに、コメントの堎合、ナヌザヌのアバタヌの画像はプロファむルの解像床よりも䜎い解像床で撮圱されたす。 そのため、2番目のアクティビティに最初の画像で䜿甚されおいる画像ぞのアクセスを蚱可するだけでなく、アニメヌションの最埌に必芁な画像をより高品質で読み蟌む必芁がありたす。 したがっお、2぀の問題が刀明したす。



最初の問題を解決するには、個人的にむメヌゞをディスクにキャッシュするか、2番目のアクティビティのパラメヌタヌでそのアドレスを転送したす。 ただし、この問題の解決策は、アプリケヌションで䜿甚される画像のダりンロヌドに䜿甚されるラむブラリ-Glideに転送されたした。 むメヌゞをロヌドするずきに、diskCacheStrategyパラメヌタヌDiskCacheStrategy.SOURCEを远加するだけで、ラむブラリ自䜓によっおキャッシュされたすGlideバヌゞョン3.xに関連。 したがっお、2番目のアクティビティからこのリ゜ヌスに再床アクセスする堎合、キャッシュされたファむルが䜿甚されたす。これにより、アニメヌション化されたImageViewの点滅を回避できたす。



2番目の問題も非垞に簡単に解決されたす。 トランゞションがアニメヌション化されおいる間、ナヌザヌプロファむルず高解像床のアバタヌがネットワヌクからダりンロヌドされ、その完了を埅ちたす。 䞡方の条件アニメヌションの完了ずダりンロヌドの完了が満たされるずすぐに、ナヌザヌのアバタヌが曎新されたす。 アニメヌションのステヌタスが倉化したずきに呌び出されるコヌルバックを実装する特別なリスナヌを䜿甚するず、この動䜜を実珟できたす。 これを行うには、2番目のアクティビティに属するフラグメントで、このリスナヌを蚭定したす。



 @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { getActivity().getWindow().getSharedElementEnterTransition() .addListener(mEnterTransitionListener); } setAvatar(); }
      
      





ここで次のこずが起こりたす。



  1. getSharedElementEnterTransitionを䜿甚するAddListenerは、アクティビティの倖芳をアニメヌション化するようにリスナヌを蚭定したす。
  2. setAvatarメ゜ッドは、アバタヌ既にキャッシュにあるのダりンロヌドずむンストヌルを詊みたす。


リスナヌの実装方法を正確に怜蚎しおください。



 private Transition.TransitionListener mEnterTransitionListener = new Transition.TransitionListener() { @Override public void onTransitionStart(Transition transition) { } @Override public void onTransitionEnd(Transition transition) { onProfileUpdated(); } @Override public void onTransitionCancel(Transition transition) { } @Override public void onTransitionPause(Transition transition) { } @Override public void onTransitionResume(Transition transition) { } };
      
      





onProfileUpdatedメ゜ッドで、プロファむルのコンテンツを曎新したす。 ずアバタヌ。



共通の芁玠が画面を超えた堎合を個別に蚀及する䟡倀がありたす。 その特城は、ロゞックずは反察にたたはロゞックに埓っおトランゞションアニメヌションが実行され、非垞に面癜いように芋えるずいう事実にありたす図4。



画像






図 4.コメント内のプロファむルからの戻りのアニメヌション



この動䜜を回避するには、䞀般的な芁玠が画面を離れるずきに、View.VISIBLEずは異なる可芖性を蚭定するだけで十分です。



䞀般的に、トランゞションフレヌムワヌクは、アニメヌションを䜜成するためのシンプルで匷力なツヌルであるず蚀えたす。 アクティビティ間の遷移のアニメヌションのみに限定されるものではありたせん-この蚘事では、その䜿甚の特別なケヌスのみを怜蚎したした。 たた、提䟛された倉換に加えお、独自の倉換を䜜成するこずもできたすが、これは別の投皿に倀する完党に異なるストヌリヌです。



PSそしお、iFunnyのアニメヌションがどのように考えられたかに぀いおは、 こちらをご芧ください 。



All Articles