zoukankan      html  css  js  c++  java
  • Android 帧动画使用

    帧动画

    使用一系列不同的图片,然后像一卷胶卷一样按顺序播放,这是一种传统的动画,也可称为帧动画。也可以比喻为像一卷胶卷一样按顺序播放。
    播放起来,有点像在看gif图。

    本文介绍使用AnimationDrawable类来实现动画效果。
    为了开发方便,我们可以在xml中指定动画各个帧的信息。

    使用背景图片

    这是第一个例子。我们先准备4张图片(图片请自备)放进res/drawable/中。
    在这个目录里,再新建一个文件ani_frame_1.xml

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/ani_frame_1"
        android:oneshot="false">
        <item
            android:drawable="@drawable/f_zan_1"
            android:duration="250" />
        <item
            android:drawable="@drawable/f_zan_4"
            android:duration="250" />
        <item
            android:drawable="@drawable/f_zan_3"
            android:duration="250" />
        <item
            android:drawable="@drawable/f_zan_2"
            android:duration="250" />
    </animation-list>
    

    可以看到根节点<animation-list>包含了4个item。每个子节点都定义了一个帧。
    duration是这一帧的时常(毫秒)。drawable是指定可绘制资源。oneshot="false",表示让动画一直循环播放下去。
    这样动画资源就准备好了。

    在layout中准备一个ImageView,用它来显示动画

    <ImageView
        android:id="@+id/iv1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginTop="60dp" />
    

    在activity中操作这个ImageView。把动画资源设置为背景。

    var mFrameIv: ImageView? = null
    // override fun onCreate(savedInstanceState: Bundle?)
    mFrameIv = findViewById(R.id.iv1)
    mFrameIv!!.setBackgroundResource(R.drawable.ani_frame_1)
    

    把ImageView的背景强转为AnimationDrawable。播放动画,要用AnimationDrawable.start()方法。

    val ani: AnimationDrawable = mFrameIv!!.background as AnimationDrawable
    ani.start()
    

    当动画正在播放时,调用start()方法是不会影响当前播放的。

    停止动画,AnimationDrawable.stop()

    val ani: AnimationDrawable = mFrameIv!!.background as AnimationDrawable
    ani.stop()
    

    stop()方法可以让动画停止在当前帧。再调用start()的话,会从头开始播放。

    使用src

    前面我们利用的是ImageView的背景资源。我们也可以使用src
    准备另一个动画资源ani_frame_2

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/ani_frame_1"
        android:oneshot="true">
        <item
            android:drawable="@drawable/f_zan_1"
            android:duration="250" />
        <item
            android:drawable="@drawable/f_zan_4"
            android:duration="250" />
        <item
            android:drawable="@drawable/f_zan_3"
            android:duration="250" />
        <item
            android:drawable="@drawable/f_zan_2"
            android:duration="250" />
    </animation-list>
    

    android:oneshot="true",动画播放1次后就会自行停止并保持在最后一帧。

    ! 注意,停止后并不是回到第一帧。

    然后在layout中,把它设置为ImageView的src

    <ImageView
        android:id="@+id/iv1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginTop="60dp"
        android:src="@drawable/ani_frame_2" />
    

    在activity中就不是操作ImageView的background了,而是操作drawable

    // 启动
    val ani: AnimationDrawable = frameIv.drawable as AnimationDrawable
    ani.start()
    
    // 停止
    val ani: AnimationDrawable = frameIv.drawable as AnimationDrawable
    ani.stop()
    

    可以看到,2个例子中都需要操作AnimationDrawable
    请务必注意,对 AnimationDrawable.start() 方法不能在 Activity 的 onCreate() 方法期间调用,因为 AnimationDrawable 尚未完全附加到窗口。如果想立即播放动画而无需互动,那么可能需要从 Activity 中的 onStart() 方法进行调用,该方法会在 Android 在屏幕上呈现视图时调用。

    AnimationDrawable类有几个属性可以注意一下

    属性 说明
    isOneShot 是否只播放1次,与xml中的android:oneshot对应
    isRunning 当前动画是否正在播放
    numberOfFrames 帧的数量

    参考

    一个软件工程师的记录
  • 相关阅读:
    六、Redis主从复制 
    五、AOF持久化
    四、RDB持久化
    三、数据类型
    二、redis的配置文件介绍
    第八章、堆
    九、补充
    八、Filter
    七、监听器和国际化
    六、JDBC
  • 原文地址:https://www.cnblogs.com/rustfisher/p/15103501.html
Copyright © 2011-2022 走看看