动画也是 Android 知识体系中一块非常重要的内容,我们要想在界面中实现一些炫酷的效果,那么必然离不开动画。Android 中动画分为三种,View 动画(视图动画)、帧动画、属性动画。其中帧动画也属于 View 动画的一种。
View 动画由 5 种类型组成:透明度(alpha)、旋转(rotate)、缩放(scale)、位移(translate)、动画集(set)。
使用动画标签创建视图动画有两个步骤。
动画文件存放在 res/anim 文件夹下面,使用时候,需要使用 R.anim.XXX 来访问,位置如下图所示。
//1.使用 XML 配置动画文件
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="0"
android:toXScale="1.5"
android:fromYScale="0"
android:toYScale="1.5"
android:pivotX="50%"
android:pivotY="50%">
</scale>
//2.在界面中加载动画并使用
ImageView iv = findViewById(R.id.iv);
Animation animation = AnimationUtils.loadAnimation(this,R.anim.scalse_anim);
//设置动画时间
animation.setDuration(3000);
//控件开始动画
iv.startAnimation(animation);
alpha 实现透明度的变化的动画,自身属性如下。
rotate 实现画面旋转的动画,自身属性如下。
scale 实现缩放的动画,自身属性如下。
scale 实现位移的动画,自身属性如下。
set 集合表示动画集合,如下代码所示。
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="1"
android:toAlpha="0" />
<scale
android:fromXScale="1.5"
android:fromYScale="1.5"
android:toXScale="1"
android:toYScale="1" />
set>
View 视图除了自身的属性,还继承了 Animation 的属性,Animation 所有动画的基类。
View 动画代码实现形式比较简单,xml 形式可以转成代码实现。
标签 | 类 |
---|---|
alpha | AlphaAnimation |
scale | ScaleAnimation |
rotate | RotateAnimation |
translate | TranslateAnimation |
set | AnimationSet |
//示例代码,直接 new 就可以
AlphaAnimation alpha = new AlphaAnimation(1.0f,0.0f)
alpha .setDurtion(1000);
iv.startAnimation(alpha);
需要注意 android:pivotX 有三种样式,数值、百分数、百分数p,转成代码变成构造函数参数 pivotXType
另外 android:repeateMode 转换成代码为 setRepeatMode() 取值为 Animation.RESTART 和 Animation.REVERSE,android:reateCount = “infinite” 转换成代码为 setRepeateCount(Animation.INFINITE) 。
public AnimationSet(Context context, AttributeSet attrs)
//shareInterpolator 为 true,共用插值器
public AnimationSet(boolean shareInterpolator)
//1.取消动画
void cancel()
//2.重置动画
void reset()
//3.设置动画监听
void setAnimationListener(AnimationListener listener)
逐帧动画,其实就是一帧一帧播放图片,可以通过 XML 实现或者 Java 实现。逐帧动画比较消耗内存,使用完成之后一定要释放掉。
//1.在 drawable 新建一个 XML 文件
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false"><!--是否只播放一次-->
<!--android:drawable 图片位置,
android:duration 动画播放时间-->
<item android:drawable="@drawable/ic_1"
android:duration="1000"/>
</animation-list>
//2.设置给 ImageView
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/loading_anim" />
//3.使用
AnimationDrawable animation= (AnimationDrawable)iv.getBackground();
animation.start();
逐帧动画也可以使用代码实现,也比较简单。
//1.新建 AnimationDrawable 对象
AnimationDrawable animation = new AnimationDrawable();
for (int i = 1; i < 13; i++) {
//通过文件名称获取资源 id
int id = getResources().getIdentifier("ic_" + i, "drawable", getPackageName());
Drawable drawable = getResources().getDrawable(id);
//2.给 AnimationDrawable 添加帧
animation.addFrame(drawable, 100);
}
//2.无限循环
animation.setOneShot(false);
//3.设置给 ImageView
iv.setBackgroundDrawable(animation);
接下来我们写一个例子,一个加载动画,如下图所示。
动画图片资源文件如下。
1.定义 XML 文件
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item
android:drawable="@drawable/ic_1"
android:duration="1000" />
<item
android:drawable="@drawable/ic_2"
android:duration="100" />
<item
android:drawable="@drawable/ic_3"
android:duration="100" />
<item
android:drawable="@drawable/ic_4"
android:duration="100" />
<item
android:drawable="@drawable/ic_5"
android:duration="100" />
<item
android:drawable="@drawable/ic_6"
android:duration="100" />
<item
android:drawable="@drawable/ic_7"
android:duration="100" />
<item
android:drawable="@drawable/ic_8"
android:duration="100" />
<item
android:drawable="@drawable/ic_9"
android:duration="100" />
<item
android:drawable="@drawable/ic_10"
android:duration="100" />
<item
android:drawable="@drawable/ic_11"
android:duration="100" />
<item
android:drawable="@drawable/ic_12"
android:duration="100" />
<item
android:drawable="@drawable/ic_13"
android:duration="100" />
animation-list>
2.设置给 ImageView
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/loading_anim" />
3.加载动画
AnimationDrawable animation = (AnimationDrawable) iv.getBackground();
animation.start();