android Activity之間專場效果
第一種:自己編寫進出效果 然後給activity加上就ok了 例如:(首先要在res資料夾下建立anim資料夾,然後把動畫效果xml檔案放到裡面去)
1.放大進入,
zoomin.xml:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/decelerate_interpolator"> <scale android:fromXScale="0.1" android:toXScale="1.0" android:fromYScale="0.1" android:toYScale="1.0" android:pivotX="50%p" android:pivotY="50%p" android:duration="300" /> <!-- 這裡為了看到動畫演示效果,把動畫持續時間設為3秒 --> <alpha android:fromAlpha="0.1" android:toAlpha="1.0" android:duration="300" />
縮小退出
zoomout.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/decelerate_interpolator" android:zAdjustment="top"> <scale android:fromXScale="1.0" android:toXScale=".5" android:fromYScale="1.0" android:toYScale=".5" android:pivotX="50%p" android:pivotY="50%p" android:duration="300" /> <!-- 系統內建的動畫持續時間 android:duration="@android:integer/config_mediumAnimTime" --> <alpha android:fromAlpha="1.0" android:toAlpha="0" android:duration="300"/> </set>
MainActivity.java:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_1);
overridePendingTransition(R.anim.zoomin, R.anim.zoomout);
//overridePendingTransition(R.anim.alphain, R.anim.alphaout);
//overridePendingTransition(R.anim.move_in_right, R.anim.move_out_right);
//overridePendingTransition(R.anim.move_in_left, R.anim.move_out_left);
}
完成!
第二種:
第一步:在 Activity 中的 setContentView(); 方法前加入:
//在需要啟動的activity中開啟動畫的特徵
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
或者,在 AnimationActivity 中設定如下 style,並引用到 AnimationActivity 即可。
<itemname=”android:windowContentTransitions”>true</item>
第二步:在 Activity 中的 setContentView(); 方法前加入一行程式碼:
//進入效果3選1 getWindow().setEnterTransition(new Explode());//分解 是從螢幕中間進或者出,然後將檢視移動至最後位置,達到動畫的效果 //getWindow().setEnterTransition(new Slide());//滑動 是從螢幕邊緣進出,同理通過移動檢視形成動畫 //getWindow().setEnterTransition(new Fade());//淡進淡出 是通過改變檢視的透明度來達到動畫效果 //退出效果3選1 getWindow().setExitTransition(new Explode()); //getWindow().setExitTransition(new Slide()); //getWindow().setExitTransition(new Fade());
第三步:把跳轉程式碼改為這種startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
簡單的跳轉效果已經完成 如果需要共享元素的話
例如,我的例子中兩個頁面都有一個同樣內容的 textview ,所以要使其得到共享。
<!–共享元素必須新增 transitionName 屬性,且對應的元素name 值一致–>
<android.support.v7.widget.AppCompatTextView
android:id=”@+id/tv_shared_element”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_gravity=”bottom”
android:layout_marginTop=”56dp”
android:layout_marginBottom=”72dp”
android:gravity=”center_horizontal”
android:text=”@string/app_txt”
android:textColor=”#323232″
android:textSize=”18sp”
android:transitionName=”sharedelement”
tools:ignore=”UnusedAttribute”/>
注意:我們必須為兩個頁面的共同元素(textview)設定一個屬性:
android:transitionName=”sharedelement”
並且必須保證兩個 textview 的 transitionName 設定的內容一致,否者將無法達到共享元素的動畫效果。
最後的關鍵一步:更改 startActivity(); 引數內容,因為我們設定了共享元素,所以到進行指定,這樣 startActivity 時才能夠找到目標,所以啟動 activity 的程式碼因改為這樣:
//這裡的 sharedElementName必須與xml檔案中設定的值一致,否則無法共享
//tvSharedElement表示要參與共享的 view
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this,tvSharedElement,
“sharedelement”).toBundle());
如果你的兩個 activity 中有兩個及以上的內容需要共享元素動畫時,你只需要修改程式碼為:
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this,
Pair.create((View)tvSharedElement,”sharedelement”))
.toBundle());
這裡通過 Pair.create(view,”shared name”);來傳入需要共享的元素。
好了,本篇關於 android5.x 提供的幾種過渡動畫效果就展示完了,雖然過渡動畫效果很漂亮,但是也要合理的運用,也不能每一個 activity 都設定過渡動畫。那麼,如上動態圖演示的一樣,本案例關鍵程式碼將在下面貼出:
案例程式碼
MainActivity 程式碼如下:
import android.annotation.SuppressLint; import android.app.ActivityOptions; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.AppCompatButton; import android.support.v7.widget.AppCompatTextView; import android.util.Pair; import android.view.View; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; @SuppressLint(“NewApi”) public class MainActivity extends AppCompatActivity { @BindView(R.id.btn_explode) AppCompatButton btnExplode; @BindView(R.id.btn_slide) AppCompatButton btnSlide; @BindView(R.id.btn_fade) AppCompatButton btnFade; @BindView(R.id.tv_shared_element) AppCompatTextView tvSharedElement; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); } @OnClick(R.id.btn_explode) void onExplodeClick() { Intent intent = new Intent(this, AnimationsActivity.class); startActivityWithAnimation(intent, ”explode”); } @OnClick(R.id.btn_slide) void onSlideClick() { Intent intent = new Intent(this, AnimationsActivity.class); startActivityWithAnimation(intent, ”slide”); } @OnClick(R.id.btn_fade) void onFadeClick() { Intent intent = new Intent(this, AnimationsActivity.class); startActivityWithAnimation(intent, ”fade”); } private void startActivityWithAnimation(Intent intent, String animType) { intent.putExtra(“anim”, animType); //這裡的 sharedElementName 必須與 xml 檔案中設定的值一致,否則無法共享 // tvSharedElement 表示要參與共享的 view // startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, tvSharedElement, // ”shared element”).toBundle()); startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, Pair.create((View) tvSharedElement, ”shared element”)) .toBundle()); } }
MainActivity 佈局檔案我就不貼出來了,就三個 Button 和一個 TextView,最後我會給出本案例完整程式碼的資源連結,大家若不懂可以去下載來參考。
接著是 AnimationsActivity 的程式碼,這是一個開啟動畫的 Activity ,程式碼如下:
import android.annotation.SuppressLint; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.AppCompatTextView; import android.transition.Explode; import android.transition.Fade; import android.transition.Slide; import android.view.Window; import butterknife.BindView; import butterknife.ButterKnife; @SuppressLint(“NewApi”) public class AnimationsActivity extends AppCompatActivity { @BindView(R.id.tv_anim_type) AppCompatTextView tvAnimType; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在需要啟動的 activity 中開啟動畫的特徵 getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); setContentView(R.layout.activity_animations); ButterKnife.bind(this); setEnterAnim(); } @SuppressWarnings(“ConstantConditions”) private void setEnterAnim() { final String animType = (String) getIntent().getExtras().get(“anim”); tvAnimType.setText(animType); switch (animType) { case ”explode”: getWindow().setEnterTransition(new Explode()); break; case ”slide”: getWindow().setEnterTransition(new Slide()); break; case ”fade”: getWindow().setEnterTransition(new Fade()); break; } } }
AnimationsActivity 佈局檔案如下,我覺得還是有必要貼出來:
<?xml version=”1.0″ encoding=”utf-8″?> <android.support.design.widget.CoordinatorLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:app=”http://schemas.android.com/apk/res-auto” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent”> <android.support.v7.widget.ContentFrameLayout android:id=”@+id/frame” android:layout_width=”match_parent” android:layout_height=”280dp” android:background=”#ff3312″> <android.support.v7.widget.AppCompatTextView android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:layout_gravity=”center” android:text=”https://blog.csdn.net/smile_Running” android:textColor=”#ffffff” android:textSize=”20sp” tools:ignore=”HardcodedText” /> </android.support.v7.widget.ContentFrameLayout> <!– anchor 屬性必須在 CoordinatorLayout 下一級才能生效 –> <android.support.design.widget.FloatingActionButton android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:src=”@drawable/ic_person_add_black_24dp” app:elevation=”8dp” app:layout_anchor=”@id/frame” app:layout_anchorGravity=”bottom|right” /> <android.support.design.widget.FloatingActionButton android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:src=”@drawable/ic_sentiment_satisfied_black_24dp” app:elevation=”8dp” app:layout_anchor=”@id/frame” app:layout_anchorGravity=”bottom|left” /> <android.support.v7.widget.CardView android:layout_width=”220dp” android:layout_height=”120dp” app:cardBackgroundColor=”#ffdd55″ app:cardCornerRadius=”24dp” app:cardElevation=”8dp” app:layout_anchor=”@id/frame” app:layout_anchorGravity=”bottom|center_horizontal”> <android.support.v7.widget.AppCompatTextView android:id=”@+id/tv_anim_type” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:layout_gravity=”center” android:text=”animations” android:textColor=”#ffffff” android:textSize=”25sp” tools:ignore=”HardcodedText” /> </android.support.v7.widget.CardView> <android.support.v7.widget.AppCompatTextView android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:layout_gravity=”bottom” android:layout_marginBottom=”72dp” android:gravity=”center_horizontal” android:text=”@string/app_txt” android:textColor=”#323232″ android:textSize=”18sp” android:transitionName=”shared element” tools:ignore=”UnusedAttribute” /> </android.support.design.widget.CoordinatorLayout>