IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android动画浅谈(一) -> 正文阅读

[移动开发]Android动画浅谈(一)

Android动画的分类

Android中的动画主要有三类:逐帧动画、补间动画和属性动画,。逐帧动画的原理是利用人类的“视觉残留”,通过改变播放图片的形式来达到动画的效果,在实际开发中使用较少,故本文中不予以展开。主要介绍补间动画和属性动画。
补间动画:主要有旋转、位移、缩放、透明度和组合5种场景。
属性动画:可以说是以上动画的补充,可以作用于对象的任意属性。
补间动画和属性动画的区别

使用补间动画已经可以实现很多的动画效果了,但是仍然有一些局限,所以推出了属性动画作为动画的补充,但它们两者还是存在一些差别的。
1、首先是对象上,逐帧动画就暂且不说了,只针对图像制作动画。补间动画针对的对象则是View类的对象及View的子类,但有时候我们的操作对象不只有View类的对象,还有其他不是View类的对象,这时候补间动画就不能满足我们的需求了,这就诞生了属性动画。属性动画的作用对象不再局限View类及其子类,从而能够满足我们更多的需求。

2、然后是作用方法上,补间动画主要针对View指定的属性,比如position、alpha等等,而属性动画作用对象的任意属性,例如背景颜色等等。

3、最后实在作用效果上,补间动画达到的只是视觉上的效果,例如使用补间动画将某一个可点击的View移动到了界面的另一个位置,当你想要触发改View的点击事件时,你还是需要点击View原来的位置,因为补间动画只是实现了“视觉”上的移动,而没有做到实际的移动,而使用属性动画移动后的对象,点击移动后的对象才会触发对象的点击事件,因为属性动画实现的是真正意义上的移动,而不仅仅是“视觉”上。

ValueAnimator

valueAnimator是属性动画中最核心的类,属性动画的原理是不断的对值进行更新和改变,来实现动画的效果,我们只需要手动设置相应起始值和对应的终止值以及对应的时间即可以完成一个简单的动画。例如,

ValueAnimator valueAnim = ValueAnimator.ofFloat(0f, 1f);
valueAnim.setDuration(1000);
valueAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
        float value = (float)valueAnimator.getAnimatedValue();
        Log.d(TAG, "Value is "+value);
        alphaBtn.setAlpha(value);
    }
});

即可实现一个简单的值动画,动画效果是在1000ms内alphaBtn的alpha值从0变为1(即可见)。通过给对象的某些属性设置变化的值从而达到动画的效果就是值动画。

ObjectAnimator

ObjectAnimator是ValueAnimator的子类,相比于ValueAnimator,我们更常用的是ObjectAnimator,因为ValueAnimator只是提供了值的过渡、变化,具体要作用到对象的哪个属性还需要我们自己再去设置,而ObjectAnimator可以直接作用于对象的某个属性,而不必我们再次指定需要作用的属性。例如,

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(alphaBtn,"alpha",0f,1f);
objectAnimator.setDuration(1000);
objectAnimator.start();

这种方法也实现了和上面的值动画一样的动画效果,在1000ms内alphaBtn的alpha值从0变为1(即可见)。

组合动画(动画集合AnimatorSet)

一个复杂的动画常常需要多个简单的动画一起组合才能够完成,基于这样的需求,就出现了组合动画AnimatorSet。组合动画使用play()方法控制动画执行的顺序,以组合成复杂的动画。常用的类型有:

AniamtorSet.playTogtether(animator1,animator2)? :animator1和animator2同时执行
AniamtorSet.playSequentially(animator1,animator2) :?animator1和animator2顺序执行animator2在animator1之后执行
AniamtorSet.start() :开始执行组合动画

Animator监听器

在很多时候我们需要在动画的不同阶段做一些处理,这就要求我们能够识别、监听到动画的各个状态。Animator中提供了一个addListener()方法,该方法接收一个AnimatorListener对象,可以实现对动画状态的监听,给一个Animator添加监听的方法如下,
?

objectAnimator.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animator) {
        
    }
    @Override
    public void onAnimationEnd(Animator animator) {
    }
    @Override
    public void onAnimationCancel(Animator animator) {
    }
    @Override
    public void onAnimationRepeat(Animator animator) {
    }
});

onAnimationStart()会在动画开始的时候被调用;onAnimationEnd()会在动画结束的时候被调用;onAnimationCancel()会在动画取消时被调用;onAnimationRepeat()会在动画重复时被调用。

插值器(Interpolator)

在动画执行的过程中,除了平滑的过渡之外,我们可能需要一些个性化的过渡,这个时候我们就需要用到插值器(Interpolator)来对过渡过程进行一些设置和调整,常用的插值器有线性插值器(LinearInterpolator)、Bezier曲线型插值器(PathInterpolator)、正弦插值器(SinInterpolator)等等。

valueAnim.setInterpolator(new PathInterpolator(0.22f,0.25f,0.00f,1.0f));

如上是给第一个值动画添加了一个Bezier曲线型插值器,根据log中打印出来的value值可以发现,value的值不再是线性变化,而是根据我们设置的PathInterpolator进行了改变,从而达到了控制动画过程的效果。

XML动画

除了在代码里使用Java编写写动画之外,还可以使用XML编写动画,在编写动画的XML我们一共可以使用三中标签 <animator>、<objectAnimator>、<set>,分别对应代码中的ValueAnimator、ObjectAnimator、AnimatorSet。在res目录下新建一个animator文件夹,在里面新建一个alpha.xml,内容如下:

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:valueFrom="0"
    android:valueTo="1"
    android:valueType="floatType"
    android:propertyName="alpha"
    android:duration="1000"/>

该动画的使用和之前的动画使用有一点区别,在使用该动画之前需要先初始化(AnimatorInflater.loadAnimator())该动画,并为该动画设置作用的对象(setTarget()),举例如下:

Animator animator = AnimatorInflater.loadAnimator(getApplicationContext(),R.animator.alpha);
animator.setTarget(alphaBtn);
animator.start();

这样就使用XML编写了一个动画效果为在1000ms内alphaBtn的alpha值从0变为1(即可见)的动画。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-14 16:03:59  更:2021-12-14 16:04:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:30:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码