Android帧动画、补间动画、属性动画用法详解
作者:cj_286 发布时间:2023-02-06 15:02:47
在安卓开发中,经常会使用到一些动画,那么在开发中,如何使用这些动画呢?
帧动画:不是针对View做出一些形状上的变化,而是用于播放一张张的图片,例如一些开机动画,类似于电影播放,使用的是AnimationDrawable来播放帧动画
res/drawable
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true"
>
<item android:drawable="@drawable/g1" android:duration="200"></item>
<item android:drawable="@drawable/g2" android:duration="200"></item>
<item android:drawable="@drawable/g3" android:duration="200"></item>
<item android:drawable="@drawable/g4" android:duration="200"></item>
<item android:drawable="@drawable/g5" android:duration="200"></item>
</animation-list>
ImageView iv = (ImageView) findViewById(R.id.iv);
iv.setBackgroundDrawable(getResources().getDrawable(R.drawable.frame_anim));
AnimationDrawable animationDrawable = (AnimationDrawable) iv.getBackground();
//设置是否只执行一次
//animationDrawable.setOneShot(false);
animationDrawable.start();
补间动画(View动画):如果View只做一些动画,并不对View做点击或触控的一些操作,可以使用补间动画,因为View动画,并不会改变View的位置,只是做一些渲染。View动画的四种变换效果对应着Animation的四个子类:TranslateAnimation、ScaleAnimation、RotateAnimation、AlphaAnimation.
// 以view中心为缩放点,由初始状态缩小到看不间在返回到看见
ScaleAnimation animation = new ScaleAnimation(
1.0f, 0.0f,//一点点变小直到看不见为止
1.0f, 0.0f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f//中间缩放
);
animation.setDuration(BUBBLE_ENTER_CENTER_SCALE_TIME);
animation.setRepeatMode(Animation.REVERSE);
animation.setRepeatCount(1);
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
homingBubbleView(true,position,view, current, endRatioFrame);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
view.startAnimation(animation);
属性动画:API11新特性,如果对View不仅做一些动画操作,也对View做一些点击触摸的操作,可以使用属性动画,因为属性动画会改变View的位置。属性动画类有ValueAnimator、ObjectAnimator、AnimatorSet。
下面就来介绍一下两个属性动画
ValueAnimator值动画,它并不是用于对View做一些动画,它仅仅是用于两个值之间的一个过度的动画(按照时间将两个差值平分,然后根据时间来一点点的往上加),系统提供了一些ValueAnimator.ofInt()、ValueAnimator.ofFloat()用于整型和浮点型的两只之间的过度动画,如果两个值是自己自定义的类型该怎么办呢?安卓提供了一个ValueAnimator.ofObject()方法,其中一个参数是TypeEvaluator类型(类型估算器),TypeEvaluator是一个接口,给开发者的一个扩展,接口中有一个public Object evaluate(float fraction, Object startValue, Object endValue) 方法,该方法会在ValueAnimator动画期间不断的调用,fraction是0-1之间的变化率,startValue是(自定义类型的)开始值,endValue是(自定义类型的)结束值,返回类型就是自定义的类型,可以根据自己的需求来自行计算期间的值该如何变化(如可以是运行轨迹)
public class FloatEvaluator implements TypeEvaluator {
public Object evaluate(float fraction, Object startValue, Object endValue) {
float startFloat = ((Number) startValue).floatValue();
return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);
}
使用
ValueAnimator mAnimatorEnetr = ValueAnimator.ofObject(new FloatEvaluator(getContext()), 0,10);
mAnimatorEnetr.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
(Float) animation.getAnimatedValue();//这里就是返回不断变化的值
}
});
mAnimatorEnetr.setDuration(1000);
mAnimatorEnetr.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
mAnimatorEnetr.start();
ObjectAnimator动画,它是针对view来做一些属性上值得变化,它不仅在值上有一个过度的变化,而且还会将变化的值设置到所要改变的属性上,让其产生动画的效果
ObjectAnimator.ofInt(view,"translationX",10,20).setDuration(100).start(); 参数view是要产生动画的view,"translationX"属性,后面的参数是变化的区间
ObjectAnimator做属性动画的时候,并不会改变view的left,top,right,bottom值,它改变的只是translationX和translationY的值,这些参数值的关系是 x = left + translationX , y = top + translationY。在平移过程中,只会改变x 和translationX ,y和translatioinY的值。其中x和y是View左上角的坐标。


猜你喜欢
- engine的实现结构elasticsearch对于索引中的数据操作如读写get等接口都封装在engine中,同时engine还封装了索引的
- 如果想实现一个在桌面显示的悬浮窗,用Dialog、PopupWindow、Toast等已经不能实现了,他们基本都是在Activity之上显示
- 本文为大家讲解了Struts2框架的入门知识,供大家参考,具体内容如下1、Struts2框架介绍Struts2框架是MVC流程框架,适合分层
- 前言:最近终于用上了高性能的测试机(54C96G * 3),相较之前的单机性能提升了三倍,数量提升了三倍,更关键的宽带提单机升了30倍不止,
- 推荐idea2022最新激活教程:idea2021最新激活方法https://www.jb51.net/article/197138.htm
- 读取文本文件中的内容此示例读取文本文件的内容以使用 System.IO.File 选件类的静态方法 ReadAllText 和 ReadAl
- 导入maven依赖<!-- https://mvnrepository.com/artifact/com.fasterxml.jack
- 尽管Java提供了一个可以处理文件的IO操作类。 但是没有一个复制文件的方法。 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时
- 本Demo为练手小项目,主要是熟悉目前主流APP的架构模式.此项目中采用MVC设计模式,纯代码和少许XIB方式实现.主要实现了朋友圈功能和摇
- 背景最近遇到一个有意思的事情,java应用运行在阿里云的ack集群中,某一天有个应用启动突然发现阿里云上的agent都没有注册了,于是开始排
- 今天在安装VS2019的时候,在安装的过程中一直无法进入安装界面,在网上找了各种方法试了将近40分钟都没有找到有效的办法,不过就快放弃的时候
- 循环语句就是让计算机根据条件做循环计算,在条件满足时继续循环,条件不满足时退出循环。Java提供了while条件循环。它的基本用法是:whi
- 使用 replace 函数动态填充字符串String str="Hello {0},我是 {1},今年{2}岁"
- 写在前面在前后端交互过程中,为了保证信息安全,我们往往需要加点用户验证。本文介绍了用springboot简单整合token。springbo
- 本文实例讲述了java基于swing实现的五子棋游戏代码。分享给大家供大家参考。主要功能代码如下:import java.awt.*;imp
- 为大家提供的MySQL忘记密码的解决方案,供大家参考,具体内容如下1.在操作系统windows操作系统,xp或win7.中进入如下目录:C:
- 前言对于多线程,大家应该很熟悉。但是,大家了解线程池吗?今天,我将带大家全部学习关于线程池的所有知识。目录1. 简介2. 工作原理2.1 核
- 以前只知道@在C#中为了写文件路径的\不要加转义符而在前面加上@标识符,没想到@还有其他的作用1.忽略转义字符例如string fileNa
- 本文实例讲述了java实现将结果集封装到List中的方法。分享给大家供大家参考,具体如下:import java.sql.Connectio
- 本文实例展示了C#实现Datatable排序的方法,分享给大家供大家参考之用。具体方法如下:一般来说,在C#中要对Datatable排序,可