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

Android开发中常用动画以及动画分类解析

程序员文章站 2022-08-11 09:43:02
android开发中常用动画以及动画分类解析。 1.在3.0之后,一共出现了三种动画,帧动画、补间动画和属性动画。 帧动画:是将一个完整的动画拆分成一张张图片,然后将他们按顺序...

android开发中常用动画以及动画分类解析。

1.在3.0之后,一共出现了三种动画,帧动画、补间动画和属性动画。

帧动画:是将一个完整的动画拆分成一张张图片,然后将他们按顺序排列连贯播放; 补间动画(animation):专门为view设置的动画,可以设置有透明、旋转、缩放、位移效果;
缺点:只能给view设置动画,非view动画不能设置动画;并且只改变了view的动画效果并没有改变自身的位置; 属性动画(animator):可以实现补间动画的全部功能,也能改变对象本身的属性;

objectanimator

objectanimator是属性动画中最常用的一个类,可以通过它直接控制动画的属性。
执行单个动画:

objectanimator.offloat(image, "translationx", 0f, 500f) // 初始化动画,设置各个参数
        .setduration(3000) // 设置动画持续时间
        .start(); // 开始运行动画

多个动画一起执行(一):

objectanimator.offloat(image, "translationx", 0f, 500f).setduration(3000).start();
objectanimator.offloat(image, "translationy", 0f, 500f).setduration(3000).start();
objectanimator.offloat(image, "rotation", 0f, 360f).setduration(3000).start();

多个动画一起执行(二):

objectanimator animator1 = objectanimator.offloat(image, "translationx", 0f, 500f);
objectanimator animator2 = objectanimator.offloat(image, "translationy", 0f, 500f);
objectanimator animator3 = objectanimator.offloat(image, "rotation", 0f, 360f);
animatorset set = new animatorset();
set.setduration(3000);
set.playtogether(animator1, animator2, animator3);
set.start();

多个动画可以按先后顺序执行(一):

objectanimator animator1 = objectanimator.offloat(image, "translationx", 0f, 500f);
objectanimator animator2 = objectanimator.offloat(image, "translationy", 0f, 500f);
objectanimator animator3 = objectanimator.offloat(image, "rotationx", 0f, 360f);
objectanimator animator4 = objectanimator.offloat(image, "rotationy", 0f, 360f);
animatorset set = new animatorset();
set.play(animator3).before(animator2).after(animator1).with(animator4);
set.setduration(3000);
set.start();

多个动画可以按先后顺序执行(二):
设置监听animatorlistener

objectanimator animator1 = objectanimator.offloat(image, "alpha", 0f, 1f);
final objectanimator animator2 = objectanimator.offloat(image, "translationx", 0f, 500f);
final objectanimator animator3 = objectanimator.offloat(image, "translationy", 0f, 500f);
animator1.setduration(3000);
animator2.setduration(3000);
animator3.setduration(3000);
// 设置属性动画的监听事件(使用animatorlistener必须要监听所有四个事件)
animator1.addlistener(new animator.animatorlistener() {
    @override
    public void onanimationstart(animator animation) {
        animator2.start();
    }
    @override
    public void onanimationend(animator animation) {
        animator3.start();
    }
    @override
    public void onanimationcancel(animator animation) {
    }
    @override
    public void onanimationrepeat(animator animation) {
    }
});
animator1.start();

多个动画可以按先后顺序执行(三):
设置监听animatorlisteneradapter

// 设置属性动画的监听事件(使用animatorlisteneradapter可以选择不监听所有事件)
animator1.addlistener(new animatorlisteneradapter() {
    @override
    public void onanimationend(animator animation) {
        animator3.start(); // 在animator1执行完后执行animator3
    }
    @override
    public void onanimationstart(animator animation) {
        animator2.start(); //在animator1执行的同时执行animator2
    }
});
animator1.start();

valueanimator

valueanimator是整个属性动画最核心的类,objectanimator是valueanimator的子类,valueanimator负责改变对象的属性值通过不断计算来改变的,valueanimator还负责管理动画的播放次数、播放模式和动画监听等。
valueanimator的监听:
valueanimator还可以通过setrepeatcount()和setrepeatmode()方法来设置动画重复的次数和播放模式、通过setstartdelay()方法来设置动画延迟播放的时间

valueanimator animator = valueanimator.ofint(0, 100); // 产生一个从0到100变化的整数的动画
animator.setduration(2000);
animator.addupdatelistener(new valueanimator.animatorupdatelistener() {
    @override
    public void onanimationupdate(valueanimator animation) {
        integer value = (integer) animation.getanimatedvalue(); // 动态的获取当前运行到的属性值
        ((button) view).settext(value + "");
    }
});
animator.start(); // 开始播放动画

在xml中编写动画

在这里面编写动画的话可以实现动画的重用;
在项目的res目录下创建一个名为animator的文件夹,在这个文件夹中定义动画。animator动画xml文件中可以包括以下三种标签:
- :相当于java代码中的valueanimator;
- :相当于java代码中的objectanimator;
- :相当于java代码中的animatorset。
定义valueanimator:


定义objectanimator:


动画组合:

?xml version="1.0" encoding="utf-8"?>


    

    

    
        

        
    

代码调用方法:

animator animator = animatorinflater.loadanimator(mainactivity.this,r.animator.object_animator);
animator.settarget(view);
animator.start();

interpolator

nterpolator的作用是可以控制动画的变化速率
,常用api:

1)  bounceinterpolator:弹跳效果;
2)  accelerateinterpolator:逐渐加速;
3)  decelerateinterpolator:逐渐减速;
4)  acceleratedecelerateinterpolator:先加速后减速;
5)  overshootinterpolator:到达目标点时“跑过头了”,再返回到目标点;
6)  anticipateinterpolator:移动之前先向后“助跑”;
7)  anticipateovershootinterpolator:overshootinterpolator和anticipateinterpolator的组合效果;
8)  cycleinterpolator:对于指定的动画,正向做一遍,反响做一遍;

android中还为我们提供了一个接口timeinterpolator,供我们自定义插值器。我们也可以实现timeinterpolator的一些已有实现类(如baseinterpolator、interpolator)来自定义插值器。
timeinterpolator接口中又一个抽象方法setinterpolation(),方法中又一个参数input,这个参数的值在整个动画过程中从0匀速变化到1,也就是相当于一个百分比,指示当前动画播放到哪了。

viewpropertyanimator

viewpropertyanimator让我们可以使用链式,一行代码为一个view对象设置属性,示例代码如下:

textview.animate()
        .translationx(200)
        .translationy(200)
        .setduration(2000)
        .setinterpolator(new bounceinterpolator())
        .start();