Android 布局动画LayoutAnimationController与LayoutTransition

1.LayoutAnimationController

LayoutAnimationController可以看做是进场动画,作用的范围是某个ViewGroup的所有子View。

1.layout_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="600">
    <alpha
        android:fromAlpha="0"
        android:toAlpha="1"/>
    <translate
        android:fromXDelta="50%p"
        android:toXDelta="0"/>
    <scale
        android:fromXScale="0.3"
        android:fromYScale="0.3"
        android:toXScale="1"
        android:toYScale="1"/>
</set>

2.MainActivity.java

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layout_animation);
        LinearLayout linearLayout=findViewById(R.id.linear);
        Animation animation= AnimationUtils.loadAnimation(this,R.anim.layout_anim);//加载动画
        LayoutAnimationController controller=new LayoutAnimationController(animation);//实例化
        linearLayout.setLayoutAnimation(controller);//设置
    }

3.运行实例



LayoutAnimationController还有一些其他的属性:

(1)setOrder:

LayoutAnimationController.NORMAL        顺序

LayoutAnimationController.RANDOM       随机

LayoutAnimationController.REVERSE         倒叙

controller.setOrder(LayoutAnimationController.ORDER_REVERSE);


(2)setDelay:

    设置LayoutAnimation的ViewGroup每个子View出现的时间间隔。

controller.setDelay(2f);


2.LayoutTransition

LayoutTransition为ViewGroup添加删除View时提供动画,只需要在对于的ViewGroup中添加

android:animateLayoutChanges="true"

就会有系统默认的动画效果。



当然,我们也可以通过LayoutTransition自定义动画效果。


创建LayoutTransition:

        LayoutTransition transition=new LayoutTransition();

添加动画效果:

        transition.setAnimator(int transitionType,Animator animator);

transitionType:

1.LayoutTransition.APPEARING:某个View出现或添加的动画。 

2.LayoutTransition.CHANGE_APPEARING:当View添加或出现导致其他View布局改变时的动画,该动画作用去其他被影响的View,不作用于出现的View。 

3.LayoutTransition.DISAPPEARING:View消失或者隐藏的动画。 

4.LayoutTransition.CHANGE_DISAPPEARING:类似2,是View消失的动画

5.LayoutTransition.CHANGE布局改变导致某个视图随之改变,例如调整大小,但不包括添加或者移除视图。


常用的只有前四个,最后一个我也不会用。。。

因为3,4两个CHANGE与前面的两个有点不同,所以放在后面举例


LayoutTransition.APPEARING:

        LayoutTransition transition=new LayoutTransition();
        Animator translation=ObjectAnimator.ofFloat(null,"translationX", 200,0);
        transition.setAnimator(LayoutTransition.APPEARING,translation);
        linearLayout.setLayoutTransition(transition);


LayoutTransition.DISAPPEARING

 PropertyValuesHolder scaleX=PropertyValuesHolder.ofFloat("scaleX", 1f,0f);
 PropertyValuesHolder scaleY=PropertyValuesHolder.ofFloat("scaleY",1f,0f);
 ObjectAnimator animator= ObjectAnimator.ofPropertyValuesHolder(this,scaleX,scaleY);
 transition.setAnimator(LayoutTransition.DISAPPEARING,animator);


这里我们通过PropertyValuesHolder可以实现将多个ObjectAnimator组合到一起的效果。

注意:如果你照着我的代码写,前两行会报错,但又不影响运行,具体原因我也还没找到。




当我们还是按照上面的操作设置那两个CHANGE时,你就会发现问题。

代码如下:

 ObjectAnimator animator1=ObjectAnimator.ofFloat(null,"translationX", 0,200);
 transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,animator1);

结果:



不但其他View的动画效果没有,原本View的消失效果也没了。

但如果我们将其改成下面的,就可以了。

PropertyValuesHolder pvhLeft =
                PropertyValuesHolder.ofInt("left", 0,1);
        PropertyValuesHolder pvhTop =
                PropertyValuesHolder.ofInt("top", 0,1);
        PropertyValuesHolder pvhRight =
                PropertyValuesHolder.ofInt("right", 0,1);
        PropertyValuesHolder pvhBottom =
                PropertyValuesHolder.ofInt("bottom", 0,1);
        PropertyValuesHolder pvhScaleOut =
                PropertyValuesHolder.ofFloat("scaleX", 1f,2f,1f);
        ObjectAnimator changeOut = ObjectAnimator.ofPropertyValuesHolder(
                this, pvhLeft, pvhTop, pvhRight, pvhBottom,pvhScaleOut);
        transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING,changeOut);

效果:



这四个是让被影响的其余View移动的关键,但是第二个参数values不一定要设置为0,1  将其设置为0或者1也行,具体原因我也不清楚。但网上都是这么写的,大家也就姑且这么写吧

PropertyValuesHolder pvhLeft =
                PropertyValuesHolder.ofInt("left", 0,1);
        PropertyValuesHolder pvhTop =
                PropertyValuesHolder.ofInt("top", 0,1);
        PropertyValuesHolder pvhRight =
                PropertyValuesHolder.ofInt("right", 0,1);
        PropertyValuesHolder pvhBottom =
                PropertyValuesHolder.ofInt("bottom", 0,1);

LayoutTransition.CHANGE_APPEARING与LayoutTransition.CHANGE_DISAPPEARING类似,所以这里就不再举例子了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值