Android动画

一、补间动画

补间动画主要分为四种:平移、缩放、旋转、透明。

讲动画之前我可能要先给给为同学解惑,为什么要用补间动画呢?

原因有以下:

简便。由于Android提供了实现动画的类,并且实现过程简便。

极大的节省时间。由于提供了现成的实现动画的类,所以不需要开发者去自定义View、使用Handler等工具实现复杂的动画。

1.1平移动画

平移动画的类是TranslateAnimation,下面是平移动画的源码,一般是用TranslateAnimation(fromXDelta,toXDelta,fromYDelta,toYDelta)构造器创建一个平移动画类。

这个是什么意思呢?从注释上我们知道这个动画的意思是

从某个点(x1,y1)移动到(x2,y2),简单来说在一定时间内从某个点移动到某个点。唯一要知道的是这个坐标原点是什么,当初我一直以为是屏幕的右上角。然而不是,其实是当前view所在的位置,一般是指view的右上角为动画的坐标原点。补间动画示例源码如下:

这个动画的意思是view从原位置向左下角移动大概200个像素,移动的时间是1s。

1.2缩放动画

缩放动画的类是ScaleAnimation,构造这个类所用的方法是ScaleAnimation(fromX,toX,fromY,toY)

这个注释的意思是,这个视图的长从fromx变化到toX,宽从fromY变化toY,例如:

new ScaleAnimation(0f,1f,0f,1f)

上面的代码意思是,从当前的0倍变化到1倍,这里是指当前视图的倍数。1倍表示是原大小,0倍表示不显示。

1.3旋转动画

旋转动画用到的类是RotateAnimation,这个动画用到的构造器一般是

RotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f)

这个构造器的意思是指,从0度旋转到360度,RELATIVE_TO_SELF表示相对于自身,x轴相对于自身,0.5那就就是原来长度的中间。y轴相对于自身,0.5就表示原来高度的中间。两个合起来就是视图的中心位置。

那么这个动画就是从0度旋转到360度,旋转中心就是视图中心。

当然他还有其他构造器,如果有需求就需要各位同学自己去花时间研究了。

1.4透明动画

透明度动画用到的类是AlphaAnimation,它的构造器是

AlphaAnimation(1f,0f)

上面参数的意思是:从完全不透明到完全透明,0f就是完全透明,那么就是消失,1就是完全不透明,那么就是显示原样。

1.5组合动画

组合动画用到的类是AnimationSet,Set表示列表的意思,那么这个类就相对于一个列表,需要把需要组合的动画添加到这个类里面。添加动画的方法是AnimationSet.addAnimation()

上面的代码是一个平移动画和旋转动画的组合,唯一遗憾的是旋转中心不会随着平移动画的移动而移动,这需要做一些处理才行。

AnimationSet(true),这个参数是什么意思呢?其实这个参数是指,使用AnimationSet的插值器,如果是true表示所有添加到set里的动画都使用这个插值器。如果为false就使用动画自己的插值器。

如果动画没有设置插值器那么就默认使用线性插值器。

1.6插值器

我觉得有必要说明一下插值器。其实插值器是用来控制动画变化的速度,一般动画默认使用的是线性插值器,也就是匀速。

那我们来看看插值器有多少种类型:

(1)线性插值器

LinearInterpolator线性插值器是最简单的插值器,它使得动画在整个时间段内的变化是匀速的,即动画效果是线性的,不会加速或减速的感觉。

(2)加速插值器

AccelerateInterpolator加速插值器,它使动画在开始时加速运动,然后快结束时逐渐减速直到结束。这种插值器通常用于模拟物体受到重力或惯性的影响,比如物体自由落体的动画效果。

(3)减速插值器

DecelerateInterpolator与加速插值器相反,减速插值器使动画在开始时速度较快,然后逐渐减速到结束。这种插值器通常用于弹簧效果或者某些平滑过渡的动画效果。

(4)加速减速插值器

AccelerateDecelerateInterpolator这种插值器结合了加速和减速的效果,使动画在开始和结束时速度较慢,在中间时速度较快,产生一种自然的动态变化效果。一般用于自然一点的动画。

(5)抛物线插值器

PathInterpolator抛物线插值器可以根据给定的贝赛尔曲线路径来定义动画的变化规则,可以实现更加复杂和个性化的动画效果。

如果上面的插值器不符合你的需要,你也可以自定义插值器。自定义插值器需要实现TimeInterpolator接口,并实现getInterpolation方法方法来定义动画的变化规则。

二、属性动画

属性动画它可以对任何对象的属性进行动画操作,不仅局限于View。属性动画的核心类是ValueAnimator和ObjectAnimator

虽然属性动画可以操作很多类型的属性,但也有些属性可能由于特殊性质而无法直接进行动画操作,其中的一些原因可能包括:

1.没有相应的setter方法:

属性动画需要通过 setter 方法来改变属性的值,如果某个属性没有对应的 setter 方法,就无法直接进行动画操作。

2.不可变属性

某些属性可能是不可变的,即使有 setter 方法也无法改变其值。这样的属性通常不能被属性动画直接操作。

3.不支持动画的属性

有些属性可能由于设计或性能等原因而不支持动画操作。在使用属性动画时,需要仔细查看文档以确定所要操作的属性是否支持动画,并且确保属性具有对应的 setter 方法以便属性动画进行值的修改。

4.支持属性动画的属性:
(1)View属性

位置:translationX、translationY、x、y

大小:width、height、scaleX、scaleY

旋转:rotation、rotationX、rotationY

透明度:alpha

(2)Drawable属性

Drawable的透明度:alpha

(3)颜色属性

背景颜色:backgroundColor

文本颜色:textColor

(4)其他颜色

任何对象的自定义属性,只要该属性具有对应的setter方法。

这些是最常见的属性,但并不是全部。你也可以自定义属性,只要你有对应的setter方法,并且属性支持动画过渡,例如int、float、color等。

三、帧动画

帧动画是一种基于一系列预先绘制的图像帧来展示连续动画的技术。每一帧都是一个静态图像,通过连续播放这些帧来呈现动画效果。可以通过 XML 或代码来定义帧动画。

XML 示例:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
    <item android:drawable="@drawable/frame1" android:duration="100"/>
    <item android:drawable="@drawable/frame2" android:duration="100"/>
    <item android:drawable="@drawable/frame3" android:duration="100"/>
    ...
</animation-list>

代码加载帧动画:

ImageView imageView = findViewById(R.id.imageView);
imageView.setBackgroundResource(R.drawable.animation_list);
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();
animationDrawable.start();

四、第三方动画库

在Android开发中,有许多第三方动画库可供选择,这些库提供了更丰富、更复杂的动画效果,并且通常易于使用和集成。

Lottie:由Airbnb开发的矢量动画库,可将Adobe After Effects中创建的动画导出为JSON文件,并在Android中播放,这种方式一般用来替换帧动画,因为帧动画播放很容易导致内存过高。而Lottie有缓存功能可以大大降低内存。

Glide: 一个用于在 Android 上加载图片和动画的快速高效的开源媒体管理库。

TweenEngine: 一个用于实现复杂动画效果的 Java 动画引擎。

NineOldAndroids: 一个为旧版 Android 平台提供属性动画支持的库,提供了与属性动画框架类似的功能。

关注微信公众号,即可了解Android的最新的、相关知识。

  • 55
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值