1. 程式人生 > >android 學習使用Activity轉場動畫及shareElement

android 學習使用Activity轉場動畫及shareElement

以前我們定義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       點選開啟連結

又可以愉快玩耍了大笑