Android逐帧动画、属性动画的简单实现

时间:2022-09-11 08:56:35

需求

这里我们实现一个简单的逐帧动画,即一组图片快速轮换的动画效果。

实现

动画的布局文件:将每一个图片放入(这个xml文件在AS2.2只能放在drawable目录下,低版本或许可以放在anim目录)
<?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/order_loading_1"
android:duration="150" />

<item
android:drawable="@drawable/order_loading_2"
android:duration="150" />

<item
android:drawable="@drawable/order_loading_3"
android:duration="150" />

<item
android:drawable="@drawable/order_loading_4"
android:duration="150" />

<item
android:drawable="@drawable/order_loading_5"
android:duration="150" />

</animation-list>
页面的布局文件:(使用ImageView作为动画载体)
    <ImageView
android:visibility="gone"
android:layout_centerInParent="true"
android:layout_marginBottom="50dp"
android:id="@+id/img_loading"
android:layout_width="145dp"
tools:visibility="visible"
android:layout_height="138dp" />
代码实现:
    private AnimationDrawable animLoading;
private ImageView imgLoading;

/**
* 初始化动画
*/

private void initAnim() {
imgLoading.setBackgroundResource(R.drawable.order_loading);
animLoading = (AnimationDrawable) imgLoading.getBackground();
// 开始动画
animLoading.start();
}

// 停止动画
if (animLoading.isRunning()) {
animLoading.stop();
}
注意:在这里释放动画图片资源会报错,图片资源已释放。自带的回收机制会自动进行回收。

需求

 下面继续实现简单的属性动画,并带声音。

实现

动画的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="400"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="-580" />


<scale android:duration="400"
android:fromXScale="1"
android:fromYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.3"
android:toYScale="1.3" />

</set>
页面的布局文件:(使用ImageView作为动画载体)
   <ImageView
android:id="@+id/rocket"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:src="@drawable/rocket"
tools:visibility="visible"
android:visibility="gone"/>

代码实现:
private SoundPool soundPool;
private Animation animation;
ImageView rocket;

//配置火箭声音和动画
private void loadSound() {
animation = AnimationUtils.loadAnimation(getActivity(), R.anim.rocket_anim);
soundPool = new SoundPool(2, AudioManager.STREAM_SYSTEM, 5);
soundPool.load(getActivity(), R.raw.rocket, 1);
}

// 开始动画 播放声音
rocket.startAnimation(animation);
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
rocket.setVisibility(View.VISIBLE);
// 播放音效
soundPool.play(1, 1, 1, 0, 0, 1);
}

@Override
public void onAnimationEnd(Animation animation) {
rocket.setVisibility(View.GONE);
}

@Override
public void onAnimationRepeat(Animation animation) {

}
});

注意:将声音文件放在raw文件下

动画Drawable

drawable:

<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/progress_single"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360"/>

布局文件中使用:

        <ProgressBar
android:id="@+id/progress_bar"
style="@android:style/Widget.ProgressBar.Small"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_gravity="center"
android:indeterminateDrawable="@drawable/anim_progress_bar" />

如此可以直接通过布局的方法实现动画,不需要在代码中进行设置。