欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android属性动画ObjectAnimator和ValueAnimator的简单应用

程序员文章站 2022-05-04 23:37:55
...

ObjectAnimator

Android动画分为四种:alpha(渐变透明度),scale(渐变尺寸伸缩),translate(画面转换位置移动),rotate(画面转移旋转)

ofFloat

第一个参数为要控制的控件,第二个参数为动画的类型,第三个之后的参数为动画所需要的值
可以设置多个值让他反复变化

可以通过方法ofFloat (Object target,String xPropertyName,String yPropertyName, Path path)同时改变两个属性

//向右平移的同时进行放大
Path path=new Path();
path.moveTo(0,1);
path.lineTo(3,300);
ObjectAnimator.ofFloat(imageView,"translationX","scaleY",path)
    .setDuration(1000)
    .start();

透明度

Android属性动画ObjectAnimator和ValueAnimator的简单应用

ofFloat方法的第二个参数传入alpha,表示透明度,1,0.5f表示由不透明到半透明

//透明度动画值:开始透明度,结束透明度...
//可以设置多个值让他反复变化
ObjectAnimator.ofFloat(mView.ivShow, "alpha", 1, 0)
        .setDuration(5000)
        .start();
ObjectAnimator.ofFloat(mView.ivShow, "alpha", 1, 0, 1)
        .setDuration(5000)
        .start();

平移

Android属性动画ObjectAnimator和ValueAnimator的简单应用

ofFloat方法的第二个参数传入translationX,表示沿X轴平移,0,200表示在X轴方向上从0的位置移动到200

//平移动画值:开始位置,结束位置...
//可以设置多个值让他反复变化
ObjectAnimator.ofFloat(mView.ivShow, "translationX", 0, 800)
        .setDuration(5000)
        .start();
ObjectAnimator.ofFloat(mView.ivShow, "translationX", 0, 800, 50)
        .setDuration(5000)
        .start();

旋转

Android属性动画ObjectAnimator和ValueAnimator的简单应用

ofFloat方法的第二个参数传入rotationX和rotationY,表示沿X轴、Y轴旋转,0,360表示旋转一周

//以X轴为轴旋转一圈
ObjectAnimator.ofFloat(mView.ivShow,"rotationX",0,360)
        .setDuration(5000)
        .start();
//以Y轴为轴旋转一圈
ObjectAnimator.ofFloat(mView.ivShow,"rotationY",0,360)
        .setDuration(5000)
        .start();

ValueAnimator

属性动画,是继逐帧动画和补间动画之后Android引入的更方便自定义的动画类

ValueAnimator 是 ObjectAnimator 的父类,他两之间的区别是,ObjectAnimator 在ValueAnimator 的基础上,通过反射技术实现了动画功能,也就像我刚刚所举的例子,子要给了 ObjectAnimator 两个值(from,to),在确定动画类型(“scale,ranslate”),他就能自动生成动画。

与之形成区别,虽然我们同样需要给 ValueAnimator 传递起始和最终两个值,但是 ValueAnimator 并不会自动去执行什么,而是会通过 addUpdateListener 的监听方法,在时间插值器的作用下,有序的返回一连串数值,然后我们就可以通过这些数值,对控件进行设置。

常用方法

anim.setDuration(500); //设置动画运行的时长
anim.setStartDelay(500); //设置动画延迟播放时间

实例

页面跳转

//动画跳转
ValueAnimator welAnimator = ValueAnimator.ofFloat(1f, 0f).setDuration(800);
welAnimator.setStartDelay(1000); //延时启动
welAnimator.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animator) {
        startActivity(new Intent(MainActivity.this, BookReadActivity.class));
        MainActivity.this.finish(); //关闭当前页面,这样欢迎页面就不会出现在返回栈中。
    }
    @Override
    public void onAnimationEnd(Animator animator) {    }
    @Override
    public void onAnimationCancel(Animator animator) {    }
    @Override
    public void onAnimationRepeat(Animator animator) {    }
});
welAnimator.start();

变更透明度

welAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
        float alpha = (Float) valueAnimator.getAnimatedValue();
        mView.welcomeLove.setAlpha(alpha);
        mView.welcomeQy.setAlpha(alpha);
    }
});