Android 5.0 对 Activity的跳转动画增加了新的特效。
三种Translation类型
进入:一个进入的过渡(动画)决定activity中的所有的视图怎么进入屏幕。
退出:一个退出的过渡(动画)决定一个activity中的所有视图怎么退出屏幕。
共享元素:一个共享元素过渡动画决定两个activities之间的过渡,怎么共享它们的视图。
其中 进入退出包括
explode(分解) –进或出地移动视图,从屏幕中间
slide(滑动) -进或出地移动视图,从屏幕边缘
fade(淡出) –通过改变屏幕上视图的不透明度达到添加或者移除视图(的效果)
共享元素包括
changeBounds - 改变目标视图的布局边界
changeClipBounds - 裁剪目标视图边界
changeTransform - 改变目标视图的缩放比例和旋转角度
changeImageTransform - 改变目标图片的大小和缩放比例
过渡使用方法 :
1.在ActivityA调转时调用
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
2.在ActivityB中设置 , 代表允许使用Transitions
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
或者在样式文件中设置
<item name="android:windowContentTransitions">true</item>
3.在ActivityB中设置进入的动画效果
- getWindow().setEnterTransition(new Explode());
或 在ActivityA中设置离开的动画效果
- getWindow().setExitTransition(new Explode());
共享元素使用方法:
1.在ActivityA调转时调用
//单个元素共享
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
//多个元素共享
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, Pair.create(v, "share"), Pair.create(fab, "fab")).toBundle());
2. 在两个activity文件中设置相同android:transitionName="xx" 元素的节点即可
具体实例
ActivityA
public class MainActivity extends AppCompatActivity {
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//分解
public void explode(View v) {
intent = new Intent(this, OtherActivity.class);
intent.putExtra("flag", 0);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
}
//滑动
public void slide(View v) {
intent = new Intent(this, OtherActivity.class);
intent.putExtra("flag", 1);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
}
//淡出
public void fade(View v) {
intent = new Intent(this, OtherActivity.class);
intent.putExtra("flag", 2);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
}
//共享元素
public void share(View v) {
View fab = findViewById(R.id.fab);
intent = new Intent(this, OtherActivity.class);
intent.putExtra("flag", 3);
// startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, v, "share").toBundle());
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, Pair.create(v, "share"),
Pair.create(fab, "fab")).toBundle());
}
}
activityA的布局文件中设置了两个共享元素
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="5dp"
android:text="share"
android:onClick="share"
android:transitionName="share"
/>
<Button
android:id="@+id/fab"
android:layout_width="56dp"
android:layout_height="56dp"
android:transitionName="fab"
android:background="@android:drawable/ic_btn_speak_now"
android:elevation="5dp"
/>
ActivityB, 注意setContentView方法一定要在requestFeature方法与设置的动画效果之后执行,而已这里不能继承AppCompatActivity 我们直接继承Activity
public class OtherActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
int flag = getIntent().getIntExtra("flag", -1);
//设置进入的动画
if (flag == 0) {
getWindow().setEnterTransition(new Explode());
} else if (flag == 1) {
getWindow().setEnterTransition(new Slide());
} else if (flag == 2) {
getWindow().setEnterTransition(new Fade());
} else if (flag ==3) {
}
setContentView(R.layout.content_main);
}
}
ActivityB中设置了两个共享元素与ActivityA中的名称一致
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.jiangwei.transanimation.MainActivity"
tools:showIn="@layout/activity_main">
<View
android:layout_width="match_parent"
android:layout_height="300dp"
android:background="@android:color/darker_gray"
android:transitionName="share" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:transitionName="fab"
android:layout_centerInParent="true"
android:text="xxxxxxxxxxxxxxxxxx" />
</RelativeLayout>