xiuyuantech 博客 – 自定义帧动画

帧动画非常容易理解,其实就是简单的由N张静态图片收集起来,然后我们通过控制依次显示 这些图片,因为人眼"视觉残留"的原因,会让我们造成动画的"错觉",跟放电影的原理一样!
Android中实现帧动画,有两种方式:1、代码方式 2、xml方式 。

xiuyuantech博客

xiuyuantech 博客:https://xiuyuantech.github.io/

xiuyuantech,xiuyuan博客,xiuyuantech.github.io

简介

而Android中实现帧动画,一般我们会用到前面讲解到的一个Drawable:AnimationDrawable 先编写好Drawable,然后代码中调用start()以及stop()开始或停止播放动画~
当然我们也可以在Java代码中创建逐帧动画,创建AnimationDrawable对象,
然后调用 addFrame(Drawable frame,int duration)向动画中添加帧,接着调用start()和stop()而已~。

下面我们来写两个例子体会下帧动画的效果以及熟悉下用法:

1、代码方式

package com.example;
public class MainActivity extends AppCompatActivity {

private ImageView iv_ani;
private AnimationDrawable mAnimationDrawable;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_ani = (ImageView) findViewById(R.id.iv_ani);
initAnimationDrawable();
}

private void initAnimationDrawable(){
mAnimationDrawable = new AnimationDrawable();
for (int i = 1; i <= 4; i++) {
int id = getResources().getIdentifier(“sample_” + i, “mipmap”, getPackageName());
Drawable drawable = getResources().getDrawable(id);
mAnimationDrawable.addFrame(drawable, 100);
}
mAnimationDrawable.setOneShot(false);
iv_ani.setImageDrawable(mAnimationDrawable);

}
}

通过AnimationDrawable的addFrame(Drawable frame, int duration) : 添加一帧,并设置该帧显示的持续时间。

2、xml方式

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item
        android:drawable="@mipmap/img_zhuan1"
        android:duration="80" />
    <item
        android:drawable="@mipmap/img_zhuan2"
        android:duration="80" />
    <item
        android:drawable="@mipmap/img_zhuan3"
        android:duration="80" />
     <!--限于篇幅,省略其他item,自己补上-->
    ...
</animation-list

在Activity中设置Drawable并启动动画:

package com.example;
public class MainActivity extends AppCompatActivity {

private ImageView iv_ani;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_ani = (ImageView) findViewById(R.id.iv_ani);
iv_ani.setImageDrawable(R.drawable.frame_animation);
AnimationDrawable animationDrawable = (AnimationDrawable) iv_ani.getDrawable();
animationDrawable.start();
}
}

在Drawable资源文件中创建文件frame_animation.xml。

优缺点

优点:目前这两种方式适合场景简单,图片资源较少的情况。
当动画要求酷炫复杂时,使用这两种方式会导致内存异常

缺点:同时加载多张图片,占用内存资源比较大。

优化版:

网上资源都是通过自定义View实现帧动画,例如:FrameAniamtionView

效果如下:

帧动画

总结

生产环境下不适合使用下原生提供的实现方式,容易产生问题。
推荐大家使用优化版自定义方式来实现帧动画,节约内存,
也不易发生OOM。注意一点bitmap用完不再使用时及时回收。

文章来源:https://xiuyuantech.github.io/2020/10/24/optimise-frame-animation/

业务咨询:https://soloist.pages.dev

跨平台移动端开发方案

本文来自投稿,不代表独立开发前线立场,如若转载,请注明出处:https://91wink.com/xiuyuantech-%e5%8d%9a%e5%ae%a2-%e8%87%aa%e5%ae%9a%e4%b9%89%e5%b8%a7%e5%8a%a8%e7%94%bb/

Like (0)

相关推荐

发表回复

Please Login to Comment

联系我们

邮件:ove2022@126.com