逐帧动画:Frame Animation

QuibblerQuibbler 2020-09-06 约 10 分钟 1858 次阅读

逐帧动画:Frame Animation


逐帧动画,简单好用的动效,一帧一帧的播放图片。比如一般手机刚开机时候显示的Logo是逐帧动画,注意逐帧动画需要加载大量的图片,因而很耗内存,使用的时候一定要注意别导致内存泄漏和OOM,不要加载过多和过大的图片。有两种方式实现逐帧动画:代码方式和XML方式。

1、代码实现

逐帧动画用到的AnimationDrawable类,通过该类可以用代码实现逐帧动画的效果。

1.1、AnimationDrawable类

逐帧动画用到的AnimationDrawable类在android.graphics.drawable包中,AnimationDrawable用于创建由一系列Drawable对象定义的逐帧动画,这些对象可用作View对象的背景。

1.2、代码实现

①构造AnimationDrawable对象

AnimationDrawable animationDrawable = new AnimationDrawable();

②添加res/drawable/资源,一般资源文件都是带序列的,所以通过文件名getIdentifier()查找到资源id再添加。

for (int i = 1; i <= 15; i++) {
        int drawableID = getResources().getIdentifier("movie_" + i, "drawable", getPackageName());
        Drawable drawable = getResources().getDrawable(drawableID, getTheme());
        animationDrawable.addFrame(drawable, 100);
    }

③设置给ImageView作为背景

imageView.setImageDrawable(animationDrawable);

④设置逐帧动画并开始播放

animationDrawable.setOneShot(false);
    animationDrawable.start();

2、xml实现

创建逐帧动画的最简单方法是在XML文件中定义动画,该动画文件位于res/drawable/文件夹中,并将其设置为View对象的背景。然后,调用start()运行动画。

2.1、创建XML

逐帧动画的xml必须定义在res/drawable/文件夹下,否则无法识别animation-list标签。查看老的博客似乎以前也可以定义在res/anim/动画目录下,现在不可用。XML属性含义说明:

①android:drawable:引用要用于框架的可绘制资源

②android:duration:显示此帧的时间(以毫秒为单位)

③android:oneshot:如果为true,则动画将只运行一次,然后停止。如果为false(默认值),它将继续运行,在最后一帧结束后从第一帧重新开始。

④android:variablePadding:如果为true,则允许可绘制对象的填充基于所选的当前状态进行更改。如果为false,则填充将保持不变(基于所有状态的最大填充)。启用此功能要求可绘制对象的所有者在状态更改时处理布局,而这通常不受支持。

⑤android:visible:提供可绘制对象的初始可见性状态;默认值为false。

例子:

<?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/movie_1"
        android:duration="120" />
    <item
        android:drawable="@drawable/movie_2"
        android:duration="120" />
    <item
        android:drawable="@drawable/movie_3"
        android:duration="120" />
    <item
        android:drawable="@drawable/movie_4"
        android:duration="120" />
    <item
        android:drawable="@drawable/movie_5"
        android:duration="120" />
    <item
        android:drawable="@drawable/movie_6"
        android:duration="120" />
    <item
        android:drawable="@drawable/movie_7"
        android:duration="120" />
    <item
        android:drawable="@drawable/movie_8"
        android:duration="120" />
    <item
        android:drawable="@drawable/movie_9"
        android:duration="120" />
    <item
        android:drawable="@drawable/movie_10"
        android:duration="120" />
    <item
        android:drawable="@drawable/movie_11"
        android:duration="120" />
    <item
        android:drawable="@drawable/movie_12"
        android:duration="120" />
    <item
        android:drawable="@drawable/movie_13"
        android:duration="120" />
    <item
        android:drawable="@drawable/movie_14"
        android:duration="120" />
    <item
        android:drawable="@drawable/movie_15"
        android:duration="120" />
</animation-list>

添加连续的一系列图片资源,这样播放起来效果连续。其实动画片也是这样一系列图片播放形成的。

2.2、添加背景

直接将逐帧动画XML设置为View的背景android:background 

<ImageView
        android:id="@+id/animation_drawable"
        android:background="@drawable/drawable_animation" />

2.3、获取AnimationDrawable播放

前面通过android:background设置逐帧动画xml背景,所以还是通过调用View的getBackground()方法获取AnimationDrawable对象,需要类型转换。

ImageView imageView = findViewById(R.id.animation_drawable);
    AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();
    animationDrawable.start();

相关资料:

        Docs > Reference > AnimationDrawable">Android Developers > Docs > Reference > AnimationDrawable

        Animate drawable graphics

        Frame Animation(逐帧动画)

        Android 动画: 逐帧动画

        Android 动画之逐帧动画(Frame Animation)

        

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w