Android App开发动画特效中帧动画和电影淡入淡出动画的讲解及实战(附源码和演示视频 简单易懂)

news2025/7/11 6:11:30

需要图片集和源码请点赞关注收藏后评论区留言~~~

一、帧动画

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

Android的帧动画由动画图形AnimationDrawable生成,下面是它的主要方法

1:addFrame 添加一副图片帧

2:setOneShot 设置是否只播放一次

3:start 开始播放

4:stop 停止播放

5:isRunning 判断是否正在播放

有了动画图形,还得有一个宿主视图显示该图形,一般使用图像视图承载AnimationDrawable,即调用图像视图的setImageDrawable方法加载动画图形

除了在代码中添加帧图片之外,还可以现在XML文件中定义帧图片的排列,然后在代码中调用图像视图的setImageResource方法,加载指定的XML图形定义文件,再调用图像视图的getDrawable方法 获得动画图形的实例  效果如下

瀑布动画

 

 代码如下

Java类

package com.example.animation;

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(); // 开始播放帧动画
    }

}

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>

二、淡入淡出动画

帧动画采取后面一帧直接覆盖前面一帧的显示形式,这在快速轮播时没有什么问题,但是如果每帧之间间隔时间比较长,那么两帧之间的动画切换就会很生硬,直接从前一帧到后一帧会让人觉得很突兀,为了解决这种长间隔切换图片在视觉方面的问题,Android提供了过渡图形TrainsitionDrawable处理两张图片之间的渐变显示,即淡入淡出的动画效果

主要方法如下

setTransition 开始过渡操作

resetTransition  重置过渡操作

reverseTransition  倒过来执行过渡操作

效果如下 有点类似电影中那种缓慢切换图片的视频效果 十分有意境!

淡入淡出

 如下图所示 图像在切换 但是显得很顺畅 不生硬

 

 

 代码如下

Java类

package com.example.animation;

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

public class FadeAnimActivity extends AppCompatActivity {
    private ImageView iv_fade_anim; // 声明一个图像视图对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fade_anim);
        iv_fade_anim = findViewById(R.id.iv_fade_anim);
        iv_fade_anim.setOnClickListener(v -> showFadeAnimation());
        showFadeAnimation(); // 开始播放淡入淡出动画
    }

    // 开始播放淡入淡出动画
    private void showFadeAnimation() {
        // 淡入淡出动画需要先定义一个图形资源数组,用于变换图片
        Drawable[] drawableArray = {getDrawable(R.drawable.fade_begin), getDrawable(R.drawable.fade_end)};
        // 创建一个用于淡入淡出动画的过渡图形
        TransitionDrawable td_fade = new TransitionDrawable(drawableArray);
        iv_fade_anim.setImageDrawable(td_fade); // 设置过渡图形
        td_fade.setCrossFadeEnabled(true); // 是否启用交叉淡入。启用后淡入效果更柔和
        td_fade.startTransition(3000); // 开始时长3秒的过渡转换
    }

}

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_fade_anim"
        android:layout_width="match_parent"
        android:layout_height="500dp"
        android:scaleType="fitStart" />

</LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/18549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Request和Response

目录 1、Request和Response的概述 2、Request对象 2.1、Request继承体系 2.2、Request获取请求数据 2.2.1 获取请求行数据 2.2.2 获取请求头数据 2.2.3 获取请求体数据 2.2.4、获取请求参数的通用方式 2.3 IDEA快速创建Servlet 2.4、请求参数中文乱码问题 2.4.1、POS…

认识Spring

1.1 Spring的历程 早期的 Java EE 使用 EJB 为核心的开发方式,但是这种开发方式在实际开发环境中存在诸多问题: 使用复杂, 代码臃肿, 移植性差等.于是"Spring 之父" Rod Johnson 在其畅销书《Expert One-on-One J2EE Design and Development》中使用一个3万行代码的…

MySQL8.0优化 - 锁 - 按加锁的方式划分:显示锁、隐式锁

文章目录学习资料锁的不同角度分类锁的分类图如下按加锁的方式划分&#xff1a;显示锁、隐式锁隐式锁显式锁学习资料 【MySQL数据库教程天花板&#xff0c;mysql安装到mysql高级&#xff0c;强&#xff01;硬&#xff01;-哔哩哔哩】 【阿里巴巴Java开发手册】https://www.w3…

[附源码]计算机毕业设计JAVA基于Java的快递驿站管理系统

[附源码]计算机毕业设计JAVA基于Java的快递驿站管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; S…

车联网解决方案-最新全套文件

车联网解决方案-最新全套文件一、建设背景面临的挑战1、平台难以支撑高并发接入2、海量数据难以挖掘价值3、缺乏使能套件&#xff0c;开发效率低4、车联网的安全难以保证二、建设架构三、建设方案四、获取 - 车联网全套最新解决方案合集一、建设背景 面临的挑战 1、平台难以支…

Teams Tab App 代码深入浅出 - 配置页面

上一篇文章我们使用Teams Toolkit 来创建、运行 tab app。这篇文章我们深入来分析看一下tab app 的代码。 先打开代码目录&#xff0c;可以看到在 src 目录下有入口文件 index.tsx&#xff0c;然后在 components 目录下有更多的一些 tsx 文件&#xff0c;tsx 是 typescript的一…

实战十二:基于FM算法针对用户商品购买和浏览记录预测用户的行为 代码+数据

1.案例知识点 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。FM推荐方法…

Qt5开发从入门到精通——第十一篇二节(Qt5 事件处理及实例——键盘事件及实例)

提示&#xff1a;欢迎小伙伴的点评✨✨&#xff0c;相互学习c/c应用开发。&#x1f373;&#x1f373;&#x1f373; 博主&#x1f9d1;&#x1f9d1; 本着开源的精神交流Qt开发的经验、将持续更新续章&#xff0c;为社区贡献博主自身的开源精神&#x1f469;‍&#x1f680; 文…

基于DJYOS的UART驱动编写指导手册

1.概述 DJYOS设计通用的串口驱动模型&#xff0c;在此模型的基础上&#xff0c;移植到不同硬件平台时&#xff0c;只需提供若干硬件操作函数&#xff0c;即可完成串口驱动开发&#xff0c;使开发工作变得简单而快速执行效率高。 DJYOS源代码都有特定的存放位置&#xff0c; 建…

记录为小电机安装一个5012编码器(多摩川协议)的过程

目录 1. 编码器接口板介绍 2. 编码器接口板安装 3. 角度读取软件实现 4.总结 为了能得到更精确的角度&#xff0c;于是想要通过在测试电机上安装一个编码器来获取更精确的角度&#xff0c;方便日后调试或者校验使用&#xff0c;这里记录下操作的步骤。 1. 编码器接口板介绍…

Github Actions 自动同步到 Gitee

目录引言具体方案引言 平时开源代码一般已Github为主&#xff0c;但是会遇到网不好的情况&#xff0c;于是考虑将Github仓库自动同步到Gitee上&#xff0c;作为备份。考虑不能手动做这个事情&#xff0c;于是想到了Github Actions 自动化同步到Gitee中 具体方案 假设Github已…

Mybatis Plus一对多联表查询及分页解决方案

文章目录需求需求分析分页问题说明分页问题原因一对多场景一一对多场景二性能优化优化解决方案需求 查询用户信息列表&#xff0c;其中包含用户对应角色信息&#xff0c;页面检索条件有根据角色名称查询用户列表&#xff1b; 需求分析 一个用户对应多个角色&#xff0c;用户…

java计算机毕业设计ssm党支部在线学习

项目介绍 本党支部在线学习是针对目前学习的实际需求,从实际工作出发,对过去的学习系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的结构、概念、模型、原…

【深度学习】torch.utils.data.DataLoader相关用法 | dataloader数据加载器 | pytorch

文章目录前言一、DataLoader介绍二、DataLoader的子方法&#xff08;可调用方法&#xff09;前言 dataloader数据加载器属于是深度学习里面非常基础的一个概念了&#xff0c;基本所有的图像项目都会用上&#xff0c;这篇博客就把它的相关用法总结一下。 之所以要写这篇&#x…

1-1 开源许可证GPL, BSD, MIT, Mozilla, Apache, LGPL的介绍

文章目录前言开源许可证由来开源许可证类型开源许可证介绍GPL协议BSD协议MIT协议Mozilla许可Apache协议LGPL开源协议前言 开源许可证&#xff08;Open source licenses&#xff09;&#xff0c;广义来讲是指一种被用于计算机软件或其他产品的&#xff0c;允许在指定的条款内使…

zMemif: go语言高性能网络库

简介 开发zMemif的主要动机是go有很高的处理能力&#xff0c;但是内置的udp库的确有些寒酸&#xff0c; 纯c开发效率又有些低&#xff0c;虽然可以用nff-go来实现go和dpdk的融合&#xff0c;但是cgo编译的确有点烦人&#xff0c;而且这个项目似乎也死了。然后考虑到容器的场景…

单点登录以及实现(前后端分离和前后端不分离方式)

本文主要使用springSecurity来实现&#xff0c;其他实现请参照其原理自行研究。 一&#xff0c;单系统登录机制 1、http无状态协议 web应用采用browser/server架构&#xff0c;http作为通信协议。http是无状态协议&#xff0c;浏览器的每一次请求&#xff0c;服务器会独立处…

谷粒学院(三) 项目前端知识

一、VS Code 1、插件安装 为方便后续开发&#xff0c;建议安装如下插件&#xff08;红色矩形框标记的插件&#xff09;2、创建项目 vscode本身没有新建项目的选项&#xff0c;所以要先创建一个空的文件夹&#xff0c;如project_xxxx。 然后打开vscode&#xff0c;再在vscode里面…

二维随机向量的数学期望E与协方差σ

目录 1. 二维随机向量(X,Y)的数学期望EX, EY 2. 二维随机向量函数zg(X,Y)的数学期望EZ 3. 二维随机向量(X,Y)的方差DX, DY 4. 二维随机向量的性质&#xff08;和、积的数学期望E与方差D&#xff09; 5. 二维随机向量的协方差COV和相关系数ρ 5.1 协方差COV定义 5.2 协方…

私有数据传参

在串口工具进行输入&#xff1a; echo 1 > /dev/myled0 ---->led1灯点亮 echo 0 > /dev/myled0 ---->led1灯熄灭 echo 1 > /dev/myled1 ---->led1灯点亮 echo 0 > /dev/myled1 ---->led1灯熄灭 echo 1 > /dev/myled2 ---->led1灯点亮 echo 0 >…