开启ViewGroup默认的过场动画
<android.support.constraint.ConstraintLayout
android:id="@+id/container"
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:animateLayoutChanges为true,即可在添加和移除子控件的时候有默认动画效果
android:animateLayoutChanges="true"
>
自定义ViewGroup的过场动画
在布局的中每个对象在布局变换时都有5种状态:
APPEARING:布局中出现一个视图
DISAPPEARING:容器中消失一个视图
CHANGING:布局改变导致某个视图随之改变,例如调整大小,但不包括添加和移除视图
CHANGE_APPERAING:其他视图的出现导致某个视图改变
CHANGE_DISAPPEARING:其他视图的消失导致某个视图改变
public class LayoutChangeAnimationActivity extends AppCompatActivity {
@BindView(R.id.textView)
TextView mTextView;
@BindView(R.id.button2)
Button mButton2;
@BindView(R.id.container)
ConstraintLayout mContainer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout_change_animation);
ButterKnife.bind(this);
LayoutTransition layoutTransition = new LayoutTransition();
mContainer.setLayoutTransition(layoutTransition);
ObjectAnimator rotation = ObjectAnimator.ofFloat(null, "rotation", 0f, -3600f)
.setDuration(layoutTransition.getDuration(LayoutTransition.APPEARING));
layoutTransition.setAnimator(LayoutTransition.APPEARING,rotation);
ObjectAnimator dispear = ObjectAnimator.ofFloat(null, "translationX", 0f, 3600f,0f)
.setDuration(layoutTransition.getDuration(LayoutTransition.DISAPPEARING));
layoutTransition.setAnimator(LayoutTransition.DISAPPEARING,dispear);
PropertyValuesHolder scale = PropertyValuesHolder.ofFloat("translationX", 0f,1000f,0f);
PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 1f, 0f,1f);
ValueAnimator valueAnimator = ObjectAnimator.ofPropertyValuesHolder(scale, alpha)
.setDuration(layoutTransition.getDuration(LayoutTransition.DISAPPEARING));
}
boolean isAdd = true;
@OnClick(R.id.button2)
public void onClick() {
if (isAdd) {
mContainer.removeView(mTextView);
} else {
mContainer.addView(mTextView);
}
isAdd = !isAdd;
}
}
页面切换时的过渡动画
打开页面时的动画:
res/anim/act_open_enter
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:fromDegrees="90"
android:toDegrees="0"
android:pivotX="0%"
android:pivotY="0%"
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
android:duration="500"/>
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
android:duration="500"/>
</set>
res/anim/act_open_exit
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:fromDegrees="-90"
android:toDegrees="0"
android:pivotX="0%"
android:pivotY="0%"
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
android:duration="500"/>
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
android:duration="500"/>
</set>
Intent intent = new Intent(AchChangeAnimation1.this, AchChangeAnimation2.class)
//在startAct后调用才能生效
startActivity(intent)
overridePendingTransition(R.anim.act_open_enter,R.anim.act_open_exit)
退出当前页面时的动画
res/anim/act_close_enter
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:fromDegrees="-90"
android:toDegrees="0"
android:pivotX="0%p"
android:pivotY="0%p"
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
android:duration="500"/>
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
android:duration="500"/>
</set>
res/anim/act_close_exit
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:fromDegrees="-90"
android:toDegrees="0"
android:pivotX="0%p"
android:pivotY="0%p"
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
android:duration="500"/>
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
android:duration="500"/>
</set>
finish()
//finish()后调用才能生效
overridePendingTransition(R.anim.act_close_enter,R.anim.act_close_exit)
每次都需要调用过于麻烦,可以在主题中定义
<resources>
<!
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!
<item name="android:windowAnimationStyle">@style/ActAnimation</item>
</style>
<style name="ActAnimation"
parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/act_open_enter</item>
<item name="android:activityOpenExitAnimation">@anim/act_open_exit</item>
<item name="android:activityCloseEnterAnimation">@anim/act_close_enter</item>
<item name="android:activityCloseExitAnimation">@anim/act_close_exit</item>
</style>
</resources>
Fragment的过渡动画
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction()
//必须在add replace等方法前调用 fragmentTransaction.setCustomAnimations(R.anim.act_open_enter,R.anim.act_open_exit
,R.anim.act_close_enter,R.anim.act_close_exit)