布局改变时的过场动画

来源:互联网 发布:陕西广电网络总公司 编辑:程序博客网 时间:2024/05/22 12:45

开启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>    <!-- Base application theme. -->    <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);
原创粉丝点击