Android动画(二)——补间动画

目录

介绍

 Xml文件定义View动画

补充

alpha_animation.xml(透明度)

rotate_animation.xml(旋转)

scale_animation.xml(伸缩)

translate_animation.xml (平移)

 group_animation.xml(组合)

主活动代码

效果图

Java代码中使用补间动画

透明度定义:

缩放定义:

平移定义:

旋转定义

 集合定义

完整代码

效果仍如上图


介绍

        补间动画(Tween Animation)是一种常见的动画技术,用于在动画序列中创建平滑的过渡效果。它通过定义起始状态和结束状态之间的差异来自动生成中间帧,从而实现连续的动画效果。

        补间动画通常涉及两个关键帧(Keyframe):起始关键帧和结束关键帧。起始关键帧定义了动画的初始状态,而结束关键帧定义了动画的最终状态。通过在这两个关键帧之间进行插值计算,可以生成一系列中间帧,形成平滑的动画过渡。

        在补间动画中,可以对多个属性进行动画化,如位置、大小、旋转、透明度等。通过指定每个属性的起始值和结束值,并设置动画的持续时间和缓动函数,可以控制动画的速度、加速度和变化方式。

        补间动画具有简单易用、流畅自然的特点,常用于用户界面设计、游戏开发和电影制作等领域。现在许多动画软件和库都提供了方便的补间动画功能,使得创建和控制补间动画变得更加高效和灵活。

 Xml文件定义View动画

 通过xml来定义View动画涉及到一些公有的属性(在AndroidStudio上不能提示):

android:duration     动画持续时间
android:fillAfter    为true动画结束时,View将保持动画结束时的状态
android:fillBefore   为true动画结束时,View将还原到开始开始时的状态
android:repeatCount  动画重复执行的次数
android:repeatMode   动画重复模式 ,重复播放时restart重头开始,reverse重复播放时倒叙回放,该属性需要和android:repeatCount一起使用
android:interpolator 插值器,相当于变速器,改变动画的不同阶段的执行速度复制代码

        这些属性是从Animation中继承下来的,在alpha、rotate、scale、translate标签中都可以直接使用。

        利用xml文件定义View动画需要在工程的res目录下创建anim文件夹,所有的xml定义的View动画都要放在anim目录下。

补充

        在动画中,以数值、百分数、百分数p,比如:50、50%、50%p,他们取值的代表的意义各不相同:

        50表示以View左上角为原点沿坐标轴正方向(x轴向右,y轴向下)偏移50px的位置;

        50%表示以View左上角为原点沿坐标轴正方向(x轴向右,y轴向下)偏移View宽度或高度的50%处的位置;

        50%p表示以View左上角为原点沿坐标轴正方向(x轴向右,y轴向下)偏移父控件宽度或高度的50%处的位置(p表示相对于ParentView的位置)。

alpha_animation.xml(透明度)

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fillAfter="false"
    android:fromAlpha="1"
    android:toAlpha="0">
</alpha>

rotate_animation.xml(旋转)

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fillAfter="false"
    android:fromDegrees="0"
    android:toDegrees="360"
    android:pivotX="50%"
    android:pivotY="50%">
</rotate>

scale_animation.xml(伸缩)

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fillAfter="false"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="0.5"
    android:toYScale="0.5">

</scale>

translate_animation.xml (平移)

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fillAfter="false"
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:toXDelta="100%"
    android:toYDelta="100%">
</translate>

 group_animation.xml(组合)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="2000"
        android:fillAfter="false"
        android:fromAlpha="1"
        android:toAlpha="0"/>
    <scale
        android:duration="2000"
        android:fillAfter="false"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="0.5"
        android:toYScale="0.5"/>
    <rotate
        android:duration="2000"
        android:fillAfter="false"
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"/>
    <translate
        android:duration="2000"
        android:fillAfter="false"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="100%"
        android:toYDelta="100%"/>
</set>

主活动代码

package com.example.animationstudy;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {


    ImageView imageView2;
    Button alpha;
    Button scale;
    Button rotate;
    Button translate;

    Button group;
    
    Animation groupAnim;
    Animation alphaAnima;
    Animation scaleAnima;
    Animation rotateAnim;
    Animation translateAnim;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView2 = (ImageView) findViewById(R.id.imageView1);
        
        alpha = (Button) findViewById(R.id.alpha);
        scale = (Button) findViewById(R.id.scale);
        rotate = (Button) findViewById(R.id.rotate);
        translate = (Button) findViewById(R.id.translate);

        group = (Button) findViewById(R.id.group);
     
        alphaAnima = AnimationUtils.loadAnimation(this,R.anim.alpha_animation);
        scaleAnima = AnimationUtils.loadAnimation(this,R.anim.scale_animation);
        rotateAnim = AnimationUtils.loadAnimation(this,R.anim.rotate_animation);
        translateAnim = AnimationUtils.loadAnimation(this,R.anim.translate_animation);

        groupAnim = AnimationUtils.loadAnimation(this,R.anim.group_animation);

        alpha.setOnClickListener(this);
        scale.setOnClickListener(this);
        rotate.setOnClickListener(this);
        translate.setOnClickListener(this);

        group.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if ((view.getId() == R.id.alpha)){
            imageView2.startAnimation(alphaAnima);
        }
        if ((view.getId() == R.id.scale)){
            imageView2.startAnimation(scaleAnima);
        }
        if ((view.getId() == R.id.rotate)){
            imageView2.startAnimation(rotateAnim);
        }
        if ((view.getId() == R.id.translate)){
            imageView2.startAnimation(translateAnim);
        }
        if ((view.getId() == R.id.group)){
            imageView2.startAnimation(groupAnim);
        }
    }
}

效果图

Java代码中使用补间动画

透明度定义:

AlphaAnimation alphaAnima = new AlphaAnimation(1, 0);
        alphaAnima.setDuration(2000);

缩放定义:

ScaleAnimation scaleAnima = new ScaleAnimation(
                1, 0.5f,
                1, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f);
        scaleAnima.setDuration(2000);

平移定义:

TranslateAnimation translateAnim = new TranslateAnimation(
                Animation.RELATIVE_TO_SELF, 0,
                Animation.RELATIVE_TO_SELF, 1,
                Animation.RELATIVE_TO_SELF, 0,
                Animation.RELATIVE_TO_SELF, 1);
        translateAnim.setDuration(2000);

旋转定义

RotateAnimation rotateAnim = new RotateAnimation(
                0, 360,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f);
        rotateAnim.setDuration(2000);

 集合定义

AnimationSet animationSet = new AnimationSet(true);

        animationSet.addAnimation(alphaAnima);
        animationSet.addAnimation(rotateAnim);
        animationSet.addAnimation(scaleAnima);
        animationSet.addAnimation(translateAnim);

完整代码

package com.example.animationstudy;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity2 extends AppCompatActivity implements View.OnClickListener{

    ImageView imageView;
    Button button;
    Button next;

    AnimationSet animationSet;
    AlphaAnimation alphaAnima;
    ScaleAnimation scaleAnima;
    RotateAnimation rotateAnim;
    TranslateAnimation translateAnim;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        imageView = (ImageView) findViewById(R.id.imageView2);
        button = (Button) findViewById(R.id.button2);
        next = (Button) findViewById(R.id.nextActivity2);
        button.setOnClickListener(this);
        next.setOnClickListener(this);
        init();
    }

    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.button2){
            imageView.startAnimation(animationSet);
        }
        if (view.getId() == R.id.nextActivity2){
            Intent intent = new Intent(MainActivity2.this, MainActivity3.class);
            startActivity(intent);
        }
    }
    public void init() {
        alphaAnima = new AlphaAnimation(1, 0);
        alphaAnima.setDuration(2000);

        rotateAnim = new RotateAnimation(
                0, 360,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f);
        rotateAnim.setDuration(2000);

        scaleAnima = new ScaleAnimation(
                1, 0.5f,
                1, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f);
        scaleAnima.setDuration(2000);

        translateAnim = new TranslateAnimation(
                Animation.RELATIVE_TO_SELF, 0,
                Animation.RELATIVE_TO_SELF, 1,
                Animation.RELATIVE_TO_SELF, 0,
                Animation.RELATIVE_TO_SELF, 1);
        translateAnim.setDuration(2000);

        animationSet = new AnimationSet(true);

        animationSet.addAnimation(alphaAnima);
        animationSet.addAnimation(rotateAnim);
        animationSet.addAnimation(scaleAnima);
        animationSet.addAnimation(translateAnim);
    }
}

效果仍如上图

上一篇:Android动画(一)——逐帧动画-CSDN博客

文章参考:Android 动画详解-CSDN博客 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

〖大前端 - 基础入门三大核心之JS篇(55)〗- 内置对象

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

结构体基础全家桶(2)结构体指针

目录 指向结构体类型数据的指针&#xff1a; 指向结构体变量的指针&#xff1a; 创建&#xff1a; 应用&#xff1a; 注意事项&#xff1a; 指向结构体数组的指针 创建&#xff1a; 应用&#xff1a; 注意&#xff1a; 用结构体变量和指向结构体的指针做函数的参数 …

【Linux】文件系统、文件系统结构、虚拟文件系统

一、文件系统概述 1. 什么是文件系统&#xff1f;2. 文件系统&#xff08;文件管理系统的方法&#xff09;的种类有哪些&#xff1f;3. 什么是分区&#xff1f;4. 什么是文件系统目录结构&#xff1f;5. 什么虚拟文件系统Virtual File System &#xff1f;6. 虚拟文件系统有什…

selenium 与 chromedriver安装

本文章向大家介绍selenium 安装与 chromedriver安装&#xff0c;主要包括selenium 安装与 chromedriver安装使用实例、应用技巧、基本知识点总结和需要注意事项供大家参考。 一、安装selenium 1、Selenium简介 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开…

IDEA配置一个新项目

git clone xxxxx 下载项目主分支 git checkout xxx 切换到需要开发的分支上 配置maven仓库 在File下的Settings中设置maven仓库 配置maven仓库的文件夹 配置好maven后&#xff0c;项目中会出现一个红色的pom.xml文件&#xff0c;右击文件&#xff0c;点击…&#xff0c;pom…

RabbitMq基本使用

目录 SpringAMQP1.准备Demo工程2.快速入门1.1.消息发送1.2.消息接收1.3.测试 3.WorkQueues模型3.1.消息发送3.2.消息接收3.3.测试3.4.能者多劳3.5.总结 SpringAMQP 将来我们开发业务功能的时候&#xff0c;肯定不会在控制台收发消息&#xff0c;而是应该基于编程的方式。由于R…

ArrayList与LinkLIst

ArrayList 在Java中&#xff0c;ArrayList是java.util包中的一个类&#xff0c;它实现了List接口&#xff0c;是一个动态数组&#xff0c;可以根据需要自动增长或缩小。下面是ArrayList的一些基本特性以及其底层原理的简要讲解&#xff1a; ArrayList基本特性&#xff1a; 动…

科大讯飞(深圳)测开面试真题

一面&#xff08;测试组长面&#xff09; 1、上家公司项目以及团队的规模是怎么样的&#xff1f; 2、你负责的项目整体的流程是怎么样的&#xff1f; 3、自动化实施过程中&#xff0c;是如何和业务测试进行沟通的&#xff1f; 4、在上家公司你已经是专职做自动化了&#xf…

会声会影怎么使用? 会声会影2024快速掌握入门技巧

一听说视频剪辑我们就不由得联想到电影、电视等一些高端的视频剪辑技术&#xff0c;大家都觉得视频剪辑是一个非常复杂而且需要很昂贵的设备才可以完成的技术活&#xff0c;这对很多“门外汉”来说都可望而不可及。实际上&#xff0c;使用会声会影剪辑视频不仅是很多人都可以操…

《面向机器学习的数据标注规程》摘录

说明&#xff1a;本文使用的标准是2019年的团体标准&#xff0c;最新的国家标准已在2023年发布。 3 术语和定义 3.2 标签 label 标识数据的特征、类别和属性等。 3.4 数据标注员 data labeler 对待标注数据进行整理、纠错、标记和批注等操作的工作人员。 【批注】按照定义…

【话题】低代码123

目录 一、什么是低代码 二、低代码的优缺点 三、你认为低代码会替代传统编程吗&#xff1f; 四、有哪些低代码工具和框架 4.1 国外的平台 4.2 国内的平台 五、未来的软件研发 低代码&#xff0c;听着就过瘾的一个词。而且不是无代码&#xff0c;这说明&#xff0c;低代码…

GoogLeNet(pytorch)

亮点与创新&#xff1a; 1. 引入Inception基础结构 2. 引入PW维度变换卷积&#xff0c;启迪后续参数量的优化 3. 丢弃全连接层&#xff0c;使用平均池化层&#xff08;大大减少模型参数&#xff09; 4. 添加两个辅助分类器帮助训练&#xff08;避免梯度消失&#xff0c;用于…

方舟无限ARX-5臂的奇异验证

事情起因是&#xff0c;某技术人员号称这款机械臂无奇异点&#xff0c;博主当场一个【黑人问号脸】。 既然是串联臂&#xff0c;大概很难做到无奇异点~ 为了反驳&#xff0c;博主建模简单分析了下&#xff0c;偏置参数随便写了个&#xff0c;具体验证程序见文末。 clear,clc,…

共同编辑文档功能实现(websocket)

目录 前言 websocket封装 wangeditor下载 共同编辑文档代码实现 HTML样式部分 JS部分 css部分 前言 功能&#xff1a;实现文档共同编辑功能&#xff0c;可以实时接收到其他人的信息 思路&#xff1a;先调用接口获取相应的数据进行渲染&#xff0c;然后通过webSocket建…

C#基础知识 - 基本语法篇

C#基础知识-基本语法篇 第2节 C#基本语法2.1 C#程序结构2.2 C# 结构解析2.3 命名空间及标识符、关键字2.3.1 别名的使用2.3.2 标识符2.3.3 C#关键字 更多C#基础知识详解请查看&#xff1a;C#基础知识 - 从入门到放弃 第2节 C#基本语法 2.1 C#程序结构 “Hello, World”程序历…

棋牌的电脑计时计费管理系统教程,棋牌灯控管理软件操作教程

一、前言 有的棋牌室在计时的时候&#xff0c;需要使用灯控管理&#xff0c;在开始计时的时候打开灯&#xff0c;在结账后关闭灯&#xff0c;也有的不需要用灯控&#xff0c;只用来计时。 下面以 佳易王棋牌计时计费管理系统软件为例说明&#xff1a; 软件试用版下载或技术支…

Java架构师系统架构高可用维度分析

目录 1 导语2 可用性介绍3 本地高可用-集群、分布式4 本地高可用-数据逻辑保护5 异地容灾-双活、两地三中心6 异地容灾-DRP规划&BCP业务连续性7 多活和妥协方案8 高可用流程9 总结想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导语 Java架构师在进行系统架构设…

ELk(七)—部署Nginx

目录 部署Nginxfilebeat启动Nginx模块Module对nginx模块配置进行修改修改nginx-log.yml配置文件 部署Nginx 下面是nginx的安装脚本&#xff0c;里面的参数可以根据实际需要进行修改。 #!/bin/bash#新建一个文件夹用来存放下载的nginx源码包mkdir -p /opt/nginx cd /opt/nginx…

Android Studio 软件如何将系统自带的标题栏隐藏

目录 一、实现效果 二、开发环境 三、实现方法 ①首先创建一个新的项目 ②打开你需要隐藏标题栏的Activity ③我们看下正常的显示效果 ④然后在onCreate中进行代码编写 ⑤点击运行查询看效果 三、Android Studio 模板 一、实现效果 二、开发环境 三、实现方法 在Andro…

千帆竞渡,鸿蒙已过万重山

近期&#xff0c;华为宣布其自主研发的鸿蒙Next系统将不再兼容Android系统&#xff0c;而是完全独立运营。 也就是说&#xff0c;你的 Android APK 已经不能在 HarmonyOS NEXT 上运行&#xff0c;因为系统已经不存在 AOSP 代码&#xff0c;甚至没有 JVM。 此举意味着鸿蒙系统…