android 學習使用Activity轉場動畫及shareElement
阿新 • • 發佈:2019-02-11
以前我們定義activity轉場動畫都是如下:
Intent intent=new Intent(this,SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.enter_anim,R.anim.exit_anim);
API21以上SDK內建了轉場動畫,可以用於Activity和Fragment,包結構如下
先看下內建的3種動畫效果吧
是不是看起來很炫酷,老實說我沒感覺有啥炫酷的,哈哈
這3種動畫分別是 explode、slide、fade
現在來學習下怎麼使用的吧
前置任務:
在setContentView()之前執行,用於告訴Window頁面切換需要使用動畫
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
或者在主題裡面新增
<!-- 允許使用transitions -->
<item name="android:windowContentTransitions">true</item>
A Activity中程式碼:
switch (view.getId()) { case R.id.tv_explode_transition: mIntent.setClass(this, TransitionActivity.class); mIntent.putExtra("transition", "explode"); startActivity(mIntent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle()); break; case R.id.tv_slide_transition: mIntent.setClass(this, TransitionActivity.class); mIntent.putExtra("transition", "slide"); startActivity(mIntent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle()); break; case R.id.tv_fade_transition: mIntent.setClass(this, TransitionActivity.class); mIntent.putExtra("transition", "fade"); startActivity(mIntent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle()); break;
B Activity中程式碼:
switch (transition) { case "explode": imageView.setBackgroundResource(R.drawable.circle_red); Explode explode1 = new Explode(); getWindow().setEnterTransition(explode1); break; case "slide": imageView.setBackgroundResource(R.drawable.circle_purple); Slide slide = new Slide(Gravity.BOTTOM); slide.setDuration(500L); getWindow().setEnterTransition(slide); break; case "fade": imageView.setBackgroundResource(R.drawable.circle_blue); Fade fade = new Fade(); fade.setDuration(1000L); getWindow().setEnterTransition(fade); break; }
這樣就完事了,是不是很簡單哦,
這裡還有其他使用方法,效果一樣,用XML檔案來實現,如圖:
<?xml version="1.0" encoding="utf-8"?>
<explode xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000">
</explode>
<?xml version="1.0" encoding="utf-8"?>
<slide xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:slideEdge="end">
</slide>
<?xml version="1.0" encoding="utf-8"?>
<fade xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000">
</fade>
然後在Activity中使用
getWindow().setExitTransition(TransitionInflater.from(this).inflateTransition(R.transition.slide));
getWindow().setEnterTransition(TransitionInflater.from(this).inflateTransition(R.transition.fade));
當然了,你也可以不使用程式碼的方式,直接在你使用的主題<style>標籤裡新增類似如下程式碼:
<item name="android:windowExitTransition">@transition/explode</item>
<item name="android:windowEnterAnimation">@transition/explode</item>
<item name="android:windowReenterTransition">@transition/explode</item>
接下來學習使用shareElement共享元素過渡動畫
這個是神馬東西呢,跟轉場有啥關係呢,客官不要急,先看下效果圖:
這個吊吧,哈哈,這個就是共享元素過渡動畫,是不是有慾望了呢?
這個動畫就是為了實現前一個頁面的view過渡到後一個頁面的view的效果。
使用也很簡單,
A activity中程式碼:
case R.id.tv_share_elements:
mIntent.setClass(this, ShareElementsActivity.class);
ActivityOptions transitionActivityOptions = ActivityOptions.makeSceneTransitionAnimation(MainActivity.this
, Pair.create(findViewById(R.id.img_share), "share")
, Pair.create(findViewById(R.id.tv_share), "share_text"));
//5.0以下相容,ActivityOptionsCompat 是v4包中的類,不過也要V22.1.0及以上才有
/*ActivityOptionsCompat activityOptionsCompat1 = ActivityOptionsCompat.makeSceneTransitionAnimation(this
, Pair.create(findViewById(R.id.img_share), "share")
, Pair.create(findViewById(R.id.tv_share), "share_text"));*/
startActivity(mIntent, transitionActivityOptions.toBundle());
break;
B activity中程式碼:無
這個動畫使用不一樣了,需要在佈局檔案中做工作了
a_activity.xml
<LinearLayout
android:id="@+id/tv_share_elements"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="?android:attr/selectableItemBackground"
android:orientation="horizontal"
android:paddingLeft="@dimen/activity_horizontal_margin">
<ImageView
android:id="@+id/img_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@drawable/circle_orange"
android:transitionName="share" />
<TextView
android:id="@+id/tv_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="12dp"
android:gravity="center_vertical"
android:text="Shared Elements"
android:transitionName="share_text"/>
</LinearLayout>
b_activity.xml
<View
android:id="@+id/view_top"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@color/color_orange"
android:transitionName="share">
</View>
<TextView
android:id="@+id/tv_transition_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/activity_vertical_margin"
android:gravity="center"
android:text="Shared Elements"
android:transitionName="share_text" />
發現關鍵地方沒,share、share_text在兩個頁面的佈局中都有
transitionName就是這個關鍵地方,好了說下上面效果的出處,還不清楚的可以看下demo應該就清楚了
https://github.com/Trisaa/MaterialTranstion 點選開啟連結
https://github.com/andremion/Music-Player 點選開啟連結
又可以愉快玩耍了