Android动画了解—视图动画

视图动画

在这里插入图片描述
视图动画 包含 补间动画(Tween Animation)逐帧动画(Frame Animation)

1. 补间动画(Tween Animation)

XML实现代码实现
alpha 透明度动画AlphaAnimation
scale 缩放动画ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)
translate 移动动画TranslateAnimation
rotate 旋转动画RotateAnimation
set 动画集合AnimationSet

在这里插入图片描述

// 代码实现
TranslateAnimation translateAnim = new TranslateAnimation(0, 300, 0, -50);
translateAnim.setFillAfter(true);
translateAnim.setDuration(1000);
view.startAnimation(translateAnim);

透明的效果
在这里插入图片描述

看看XML的DEMO
在这里插入图片描述

// XML实现 => res/anim/translate_anim.xml
// 动画集合 set,包含了 alpha(透明) + rotate(旋转)
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000">
	// 透明度 0.0 ~ 1.0 的过渡
    <alpha
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />
	// 旋转(以中心旋转(0~720)
    <rotate
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="720" />
</set>
// 在代码中进行设置 xml 动画文件
Animation animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);
view.startAnimation(animation);

// 代码翻译XML
AnimationSet set = new AnimationSet(true);
set.addAnimation(new AlphaAnimation(...));
set.addAnimation(new RotateAnimation(...));
set.setDuration(3000);
view.startAnimation(set);

几个属性的含义

XML标签属性代码属性含义
android:durationsetDuration(long)时间,毫秒,动画执行的时间
android:fillAftersetFillAfter(boolean)如果为true,动画结束,保持结束时的状态
android:fillBeforesetFillBefore(boolean)如果为true,动画结束,恢复到初开始的状态
android:fillEnabledsetFillEnable(boolean)同setFillBefore类似,都是动画结束,恢复最初状态
android:repeatCountsetRepeatCount(int)动画重复次数(大于等于 0),值为 小于0 或 Animation.INFINITE 时,无限循环
android:repeatModesetRepeatMode(int)动画重复的类型 reverse(倒序回放), restart(从新开始),必须与 repeatCount一起使用,才有效果
android:interpolatorsetInterpolator(Interpolator)插值器(在属性动画的章节中一起讲解)

再看一个栗子

// 以 中间的位置 进行 缩放(1.0 ~ 1.2 ~ 1.0 ~ 1.2) 动画
ScaleAnimation scaleAnim = new ScaleAnimation(
	1.0f, 1.2f, 1.0f, 1.2f,
	Animation.RELATIVE_TO_SELF, 0.5f, 
	Animation.RELATIVE_TO_SELF, 0.5f);

其它相关属性

ScaleAnimation,AlphaAnimation 等 继承Animation,Animation 除了提供上面相关的函数外,
还提供了 cancel()取消动画reset()将控件恢复到动画开始前的状态

还可以设置动画相关的监听 Animation.setAnimationListener(new Animation.AnimationListener() { ... Start ... End ... }

AnimationListener 的 回调包含如下几个:

  • onAnimationStart(Animation animation) 动画开始时
  • onAnimationEnd(Animation animation) 动画结束时
  • onAnimationRepeat(Animation animation) 动画重复时,一般设置了 repeatCount 的重复次数,才会触发
// 示例代码
translateAnim.setAnimationListener(new Animation.AnimationListener() {
	@Override
	public void onAnimationStart(Animation animation) {
	}

	@Override
	public void onAnimationEnd(Animation animation) {
	}

	@Override
	public void onAnimationRepeat(Animation animation) {
	}
});

场景小剧场
有一个小场景,是我们公司的 一个 HDMI信号界面,就是这种水波纹,还有一些信号覆盖的也有类似的动画效果… …
在这里插入图片描述
还有界面上看到的一些进度条爱的魔力转圈圈,比如 在这里插入图片描述
还有我们看到的一些应用的过渡效果。
在这里插入图片描述
当然,使用的场景很多,这里只是列举几个… …

2. 逐帧动画(Frame Animation)

通俗的理解就是,一帧挨一帧地播放图片,就像放电影/动画片一样,可以通过XML实现,也可以通过代码实现;

XML实现

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false" | "true">
    <item android:drawable="@drawable/img000001" android:duration="60(integer)"/>
    ... ...
</animation-list>
  • android:oneshot 如果定义为 true,动画只执行一次,反之,一直循环
  • android:drawable 指定此帧动画的图片资源
  • android:duration 帧动画持续的时间,整数,单位毫秒ms

举个栗子(XML)

# playing_test_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/img000001" android:duration="60"/>
    <item android:drawable="@drawable/img000002" android:duration="60"/>
 	... ...
</animation-list>

# 布局 xml 文件
<ImageView android:src="@drawable/playing_test_anim"/>
        
# 代码执行
AnimationDrawable animDrawable = (AnimationDrawable) imageView.getDrawable();     
animDrawable.start();

在这里插入图片描述
在这里插入图片描述
AnimationDrawable 几个常用函数

函数名称含义
start开始播放
stop停止播放
int getDuration(int index)得到指定 index 帧的时间
Drawable getFrame(int index)得到指定 index 帧对应的 Drawable 对象
int getNumberOfFrames()获取 所有帧的数量
boolean isRunning()是否正在播放
setOneShot(boolean oneShot)true 执行一次,false 循环播放
boolean isOneShot()返回 true 执行一次,返回 false 循环播放
addFrame(Drrawable frame, int duration)添加一帧,并设置持续时间

代码实现

关键函数:addFrame(Drrawable frame, int duration)

举个小栗子(代码)

final AnimationDrawable animationDrawable = new AnimationDrawable();
for (int i = 1; i < 28; i++) {
	int id = getResources().getIdentifier("img00000" + i, "drawable", getPackageName());
    Drawable drawable = getResources().getDrawable(id);
    animationDrawable.addFrame(drawable, 60);
}
animationDrawable.setOneShot(false);
imageView.setImageDrawable(animationDrawable);
animationDrawable.start();

场景小剧场
帧动画 会在 制作 较为复杂的个性化动画效果 出现,比如 引导动画,还有类似的开机动画 等等
在这里插入图片描述

小总结
Frame Animation(逐帧动画)相对来说
优点:比较简单(使用简单、方便),实际开发中使用的频率还是比较高的。
缺点: 一方面是因为会造成OOM,另一方面会显得很卡,另另一方面也是资源图片也会很多;如果复杂而且帧数比较多的动画不太建议使用逐帧动画

现在 技术上 层出不穷,已经出现了很多可以替代的方案,比如 SVG动画Lottie库 等。

参考资料

Android动画-View动画的使用场景


Android动画了解—为什么需要动画<=上个章节 下个章节=> Android动画了解—属性动画(Property Animation)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值