【Android】AnimationDrawable帧动画的实现

目录

引言

一、AnimationDrawable常用方法

1.1 导包 

1.2 addFrame

1.3 setOneShot

1.4 start

1.5 stop

1.6 isRunning

二、 从xml文件获取并播放帧动画

2.1 创建XML文件 

2.2  在布局文件中使用帧动画资源

三、在代码中生成并播放帧动画

3.1 addFrame加入帧动画列表 

3.2 设置图像视图的图形为帧动画

四、代码示例 

4.1 帧动画xml文件

4.2 FrameAnimActivity.java文件

4.3 activity_frame_anim.xml文件

4.4 实现效果 

结语


引言

Android中动画分为三大类:帧动画、补间动画和属性动画。其中,帧动画是实现原理最简单的一种,跟现实生活中的电影胶卷类似,都是短时间内连续播放多张图片,从而模拟动态画面的效果。


一、AnimationDrawable常用方法

AnimationDrawable是 Android 框架中的一个类,用于在视图(如ImageView)中播放帧动画。帧动画是通过一系列静态图像(帧)的连续显示来创建动画效果的。AnimationDrawable类提供了加载和播放这些帧动画的功能。


1.1 导包 

在使用 AnimationDrawable 之前你需要先引入必要的包

import android.graphics.drawable.AnimationDrawable;

1.2 addFrame

addFrame(Drawable frame, int duration):添加一幅图片帧,并指定该帧的持续时间(单位为毫秒)。 

参数

  • frame:要添加的帧,类型为 Drawable
  • duration:该帧显示的持续时间,单位为毫秒。

这个方法通常不是在运行时调用的,因为帧动画通常是在XML文件中定义的。但是,如果您想在代码中动态添加帧,可以使用此方法。

AnimationDrawable animation = new AnimationDrawable();
Drawable frame1 = getResources().getDrawable(R.drawable.frame1);
int duration1 = 100; // 持续时间,单位为毫秒
animation.addFrame(frame1, duration1);
// 继续添加其他帧...

1.3 setOneShot

setOneShot(boolean oneShot):设置动画是否只播放一次。

参数

  • oneShot:如果为true,则动画只播放一次;如果为false,则动画循环播放。
animation.setOneShot(true); // 只播放一次
// 或者
animation.setOneShot(false); // 循环播放

1.4 start

start():开始播放动画。

注意:在调用此方法之前,必须将 AnimationDrawable 设置为某个视图的背景或内容(例如ImageVIew 的 src)。

ImageView imageView = findViewById(R.id.imageView);
imageView.setImageResource(R.drawable.animation_list); // 假设animation_list是定义的帧动画XML文件
AnimationDrawable animation = (AnimationDrawable) imageView.getDrawable();
animation.start(); // 开始播放动画

1.5 stop

stop():停止播放动画。

animation.stop(); // 停止动画

1.6 isRunning

isRunning() :判断动画是否正在播放。

boolean isAnimating = animation.isRunning(); // 判断动画是否正在播放
if (isAnimating) {
    // 动画正在播放
} else {
    // 动画已停止
}

二、 从xml文件获取并播放帧动画


2.1 创建XML文件 

在 res/drawable 目录下创建一个 XML 文件来定义帧动画。例如,创建一个名为 animation_list.xml的文件:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false"> <!-- true 表示动画播放一次后停止,false 表示循环播放 -->
    <item android:drawable="@drawable/frame1" android:duration="100" />
    <item android:drawable="@drawable/frame2" android:duration="100" />
    <item android:drawable="@drawable/frame3" android:duration="100" />
    <!-- 继续添加更多的帧 -->
</animation-list>

在这个 XML 文件中,animation-list 是根元素,android:oneshot表示动画是否播放一次就停止,item 元素表示动画中的每一帧。android:drawable 属性指定帧的图像资源,android:duration 属性指定显示该帧的持续时间(以毫秒为单位)。 


2.2  在布局文件中使用帧动画资源

在你的布局 XML 文件中,将 ImageView 的 src 属性设置为帧动画资源:

<ImageView
    android:id="@+id/animated_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/animation_list" />

三、在代码中生成并播放帧动画


3.1 addFrame加入帧动画列表 

其中第一个参数要添加的帧图片需要替换成你自己的图片,第二个参数为该帧持续时间,单位为毫秒。

AnimationDrawable ad_frame = new AnimationDrawable(); // 创建一个帧动画图形
// 下面把每帧图片加入到帧动画的列表中
ad_frame.addFrame(getDrawable(R.drawable.flow_p1), 50);
ad_frame.addFrame(getDrawable(R.drawable.flow_p2), 50);
ad_frame.addFrame(getDrawable(R.drawable.flow_p3), 50);
ad_frame.addFrame(getDrawable(R.drawable.flow_p4), 50);
ad_frame.addFrame(getDrawable(R.drawable.flow_p5), 50);
ad_frame.addFrame(getDrawable(R.drawable.flow_p6), 50);
ad_frame.addFrame(getDrawable(R.drawable.flow_p7), 50);
ad_frame.addFrame(getDrawable(R.drawable.flow_p8), 50);

3.2 设置图像视图的图形为帧动画

// 设置帧动画是否只播放一次。为true表示只播放一次,为false表示循环播放
ad_frame.setOneShot(false);
// 设置图像视图的图形为帧动画
ImageView iv_frame_anim = findViewById(R.id.iv_frame_anim);
iv_frame_anim.setImageDrawable(ad_frame);
ad_frame.start(); // 开始播放帧动画

四、代码示例 

以下是一个完整的示例,展示了如何在 Activity 中使用 AnimationDrawable : 


4.1 帧动画xml文件

<?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/flow_p1"
        android:duration="50" />
    <item
        android:drawable="@drawable/flow_p2"
        android:duration="50" />
    <item
        android:drawable="@drawable/flow_p3"
        android:duration="50" />
    <item
        android:drawable="@drawable/flow_p4"
        android:duration="50" />
    <item
        android:drawable="@drawable/flow_p5"
        android:duration="50" />
    <item
        android:drawable="@drawable/flow_p6"
        android:duration="50" />
    <item
        android:drawable="@drawable/flow_p7"
        android:duration="50" />
    <item
        android:drawable="@drawable/flow_p8"
        android:duration="50" />
</animation-list>

4.2 FrameAnimActivity.java文件

package your.package.name;

import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.widget.ImageView;

public class FrameAnimActivity extends AppCompatActivity {
    private ImageView iv_frame_anim; // 声明一个图像视图对象
    private AnimationDrawable ad_frame; // 声明一个帧动画对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_frame_anim);
        iv_frame_anim = findViewById(R.id.iv_frame_anim);
        iv_frame_anim.setOnClickListener(v -> {
            if (ad_frame.isRunning()) {  // 判断帧动画是否正在播放
                ad_frame.stop(); // 停止播放帧动画
            } else {
                ad_frame.start(); // 开始播放帧动画
            }
        });
        showFrameAnimByCode(); // 在代码中生成并播放帧动画
        //showFrameAnimByXml(); // 从xml文件获取并播放帧动画
    }

    // 在代码中生成并播放帧动画
    private void showFrameAnimByCode() {
        ad_frame = new AnimationDrawable(); // 创建一个帧动画图形
        // 下面把每帧图片加入到帧动画的列表中
        ad_frame.addFrame(getDrawable(R.drawable.flow_p1), 50);
        ad_frame.addFrame(getDrawable(R.drawable.flow_p2), 50);
        ad_frame.addFrame(getDrawable(R.drawable.flow_p3), 50);
        ad_frame.addFrame(getDrawable(R.drawable.flow_p4), 50);
        ad_frame.addFrame(getDrawable(R.drawable.flow_p5), 50);
        ad_frame.addFrame(getDrawable(R.drawable.flow_p6), 50);
        ad_frame.addFrame(getDrawable(R.drawable.flow_p7), 50);
        ad_frame.addFrame(getDrawable(R.drawable.flow_p8), 50);
        // 设置帧动画是否只播放一次。为true表示只播放一次,为false表示循环播放
        ad_frame.setOneShot(false);
        // 设置图像视图的图形为帧动画
        iv_frame_anim.setImageDrawable(ad_frame);
        ad_frame.start(); // 开始播放帧动画
    }

    // 从xml文件获取并播放帧动画
    private void showFrameAnimByXml() {
        // 设置图像视图的图像来源为帧动画的XML定义文件
        iv_frame_anim.setImageResource(R.drawable.frame_anim);
        // 从图像视图对象中获取帧动画
        ad_frame = (AnimationDrawable) iv_frame_anim.getDrawable();
        ad_frame.start(); // 开始播放帧动画
    }

}

4.3 activity_frame_anim.xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/iv_frame_anim"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:scaleType="fitStart" />

</LinearLayout>

4.4 实现效果 


结语

在深入探讨了AnimationDrawable类的各个方面后,我们可以清晰地看到它在Android动画创建中的重要作用。AnimationDrawable通过帧动画的方式,让开发者能够轻松地为应用添加生动有趣的视觉效果。然而,我们也必须认识到,在使用AnimationDrawable时,需要仔细考虑性能优化和生命周期管理,以确保动画的流畅播放和应用的稳定运行。总的来说,AnimationDrawable是一个功能强大且灵活的动画工具,值得开发者在合适的场景下加以利用。通过不断学习和实践,我们可以更好地掌握这一工具,为应用创造更加出色的动画效果。 

 

<think>嗯,用户想彻底卸载360安全卫士及其残留文件。首先,我得回忆一下常见的卸载方法,通常是通过控制面板的程序卸载功能。但用户提到的是顽固的DLL文件,可能普通的卸载方法不够彻底,会有残留。 根据参考的引用内容,用户提供的步骤涉及安全模式和系统配置工具msconfig。看来用户可能已经尝试过常规方法,但遇到无法删除的文件,所以需要进入安全模式。不过,引用里的步骤似乎有些混乱,比如第三步提到的“安全引导”可能是指引导选项中的安全模式,而第五步则是恢复正常的启动设置。 我需要整理正确的步骤。首先,正常卸载应该从控制面板开始,然后进入安全模式删除残留文件。此外,可能还需要使用专门的卸载工具,或者手动清理注册表和临时文件。另外,360可能有自己的卸载程序,但有时候会不彻底,所以需要手动检查。 用户可能不知道如何在安全模式下操作,或者如何正确使用msconfig来启用安全引导。需要详细说明每一步,比如如何进入系统配置,勾选安全引导,重启进入安全模式,然后进行删除操作。完成后,再回到系统配置取消安全引导,恢复正常启动。 另外,可能还需要检查任务管理器中是否有残留进程在运行,阻止文件删除。在安全模式下,这些进程可能不会自动启动,从而允许用户删除文件。还要提醒用户清理注册表时需谨慎,或者使用第三方工具辅助清理,避免误删系统关键文件。 总结一下,步骤应该是:1. 正常卸载;2. 进入安全模式;3. 删除残留文件和文件夹;4. 清理注册表;5. 检查启动项和服务;6. 使用清理工具。需要确保每一步都清晰,避免用户操作错误导致系统问题。</think>### 彻底卸载360安全卫士及残留文件的方法 #### **步骤1:通过控制面板卸载主程序** 1. 打开`控制面板 > 程序和功能`,找到“360安全卫士” 2. 右键选择“卸载/更改”,按照提示完成卸载流程 3. 重启电脑(部分残留文件需重启后释放) #### **步骤2:进入安全模式删除顽固文件** 1. 按`Win + R`输入`msconfig`,在“引导”选项卡勾选“安全引导”,选择“最小化”模式[^1] 2. 重启后进入安全模式,手动删除以下残留路径: - `C:\Program Files\360` - `C:\ProgramData\360` - `C:\Users\[用户名]\AppData\Roaming\360` 3. 按`Win + R`输入`msconfig`,取消“安全引导”勾选并重启 #### **步骤3:清理注册表残留** 1. 按`Win + R`输入`regedit`打开注册表编辑器 2. 搜索关键词“360Safe”或“360Total”,删除所有相关键值 *(建议操作前备份注册表)* #### **步骤4:检查启动项与服务** 1. 打开任务管理器,在“启动”标签页禁用360相关条目 2. 在“服务”标签页(按`Win + R`输入`services.msc`),停止并禁用360服务 #### **步骤5:使用专业清理工具辅助** 推荐工具: - `Geek Uninstaller`(深度扫描残留) - `CCleaner`(清理注册表与临时文件) ---
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值