Android动画之补间动画TweenAnimation

Animation 分类说明

前面分析了Animation基类,然后简单概述了动画原理,Animation动画概述
Animation可以利用类和XML文件两种方式生成动画:
下面讲解如何使用Animation的子类,包括:

  • translate (平移动画) --- TranslateAnimation
  • scale (缩放动画) --- ScaleAnimation
  • rotate (旋转动画) --- RotateAnimation类
  • alpha ( 透明度动画) --- AlphaAnimation 类

使用xml动画文件方式,利用 AnimationUtils loadAnimation()加载xml文件,可以解析生成对应动画。

更多请参阅官方文档https://developer.android.google.cn/reference/android/view/animation/Animation

1 TranslateAnimation 平移动画

构造函数:

//从资源文件加载
TranslateAnimation(Context context, AttributeSet attrs)
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)

参数说明:

image

参数说明
fromXDelta:移动的起始点X轴坐标,可以是具体数值、百分数、百分数+p 三种样式,比如 10、10%、10%p
fromYDelta:移动的 起始点Y轴从标,可以是数值、百分数、百分数p 三种样式;
toXDelta : 移动的结束点X轴坐标
toYDelta : 移动的结束点Y轴坐标

image

**fromXType : ** fromXValue的坐标类型
fromXValue: X轴方向移动的初始坐标
toXType: toXValue的坐标类型
toXValue X轴方向结束的坐标
fromYType: fromYValue的坐标类型
fromYValue: Y轴方向移动的起始点坐标
toYType: toYValue的坐标类型
toYValue: Y轴方向结束的坐标

坐标类型Type的种类:
ABSOLUTE,RELATIVE_TO_SELF,RELATIVE_TO_PARENT第一个代表具体值,第二个相对于view自己,第三个相对于父布局。

重要:所有坐标类似(fromXdelta,toXDelta,fromYDelta,ToYDelta)的值都是相对于View的左上角,所以动画坐标的原点都是View自己的左上角。view的左上角为动画进行的坐标原点(0,0)

第一个构造函数和第二个构造函数的结构不同,且第一个构造函数没有坐标类型,但是它的数值可以分成三类可以是具体数值、百分数、百分数+p 三种样式这三类就分别对应了ABSOLUTE,RELATIVE_TO_SELF,RELATIVE_TO_PARENT。

第一个构造函数中的属性可以用到xml动画文件中, 第二个则侧重代码生成平移动画。

XML实现移动动画
具体值:
一个大小为400,200的view移动400,200的距离,之后保存动画后的状态,为了标识view移动了会在view的底部绘制一个大小位置一样的粉色view作为参照。

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="0"
    android:toXDelta="400"
    android:fromYDelta="0"
    android:toYDelta="200"
    android:duration="3000"
    android:fillAfter="true">
</translate>
image

两个400*200的TextView相互覆盖,然后移动顶部的TextView移动(400,200)的距离。fillAfter为true表示动画结束时保持动画最终的效果。

如果利用百分数如何实现上面相同的代码,百分数是相对于自身大小,所以直接使用100%即可

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

100%相当于view的宽和高的100%。


image

可以看到结果相同。

利用百分数+p实现从顶部移动parent宽高的一半距离。
<?xml version="1.0" encoding="utf-8"?>

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="0"
    android:toXDelta="50%p"
    android:fromYDelta="0"
    android:toYDelta="50%p"
    android:duration="3000"
    android:fillAfter="true">
</translate>

结果图,红色框是截图是画上的,为了标识移动了整个父view的宽高的一半。


image

如果设置fromXDelta和fromYDelta为负呢?
由于动画坐标原点都是view的左上角,所以如果为负,动画开始时会出现在view的左上方。

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="-100%"
    android:toXDelta="50%p"
    android:fromYDelta="-100%"
    android:toYDelta="50%p"
    android:duration="3000"
    android:fillAfter="true">
</translate>
image

代码方式实现,简单例子

TranslateAnimation translateAnimation = new TranslateAnimation(0, 400, 0, 200);
translateAnimation.setDuration(3000);
translateAnimation.setFillAfter(true);
mTVDemo.startAnimation(translateAnimation);

2 AlphaAnimation 透明度动画

构造函数
AlphaAnimation(Context context, AttributeSet attrs):读取xml文件生成
AlphaAnimation(float fromAlpha, float toAlpha):
参数说明:
fromAlpha:开始的透明度,toAlpha:结束时的透明度
取值: 1.0f代表不透明 , 0.0f表示全透明

xml实现
实现view从透明度0.1,变化到1.0.

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="0.1"
    android:toAlpha="1.0"
    android:duration="3000"
    android:fillBefore="true">
</alpha>

代码实现

AlphaAnimation alphaAnimation = new AlphaAnimation(0.1f, 1.0f);
alphaAnimation.setDuration(3000);
alphaAnimation.setFillBefore(true);
mTVDemo.startAnimation(alphaAnimation);

3 ScaleAnimation 缩放动画

构造函数:

ScaleAnimation(Context context, AttributeSet attrs):利用xml文件生成对象
ScaleAnimation(float fromX, float toX, float fromY, float toY)

ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)

ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)

参数说明

  • fromXScale X轴方向上动画开始时相对自身的缩放比例,取值float,1.0表示没有缩放,大于1.0表示放大,小于1.0表示缩小

  • toXScale X轴方向上动画结束时相对自身的缩放比例;

  • fromYScale Y轴方向上动画开始时相对自身的缩放比例,

  • toYScale X轴方向上动画结束时相对自身的缩放比例;

  • pivotX X轴方向上相对于原点(view左上角)的移动坐标,移动后作为新的缩放原点,可以是数值、百分数、百分数p 三种样式。

  • pivotY Y轴方向上相对于原点的移动坐标,意义和android:pivotX一样。

  • pivotXType 坐标类型,类似TranslateAnimation的坐标类型,主要用于代码生成animation时,指定坐标类型

  • pivotYType 坐标类型,类似TranslateAnimation的坐标类型,主要用于代码生成animation时,指定坐标类型
    变换的坐标原点依然是view的左上角

XML方式实现动画
从坐标原点(view左上角),view由0,放大两倍。

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXScale="0.0"
    android:toXScale="2.0"
    android:fromYScale="0.0"
    android:toYScale="2.0"
    android:pivotX="0"
    android:pivotY="0"
    android:duration="3000"
    android:fillAfter="true"/>

在以view左上角为坐标原点从0经历3秒放大两倍view。


image

修改坐标原点为view的中心点

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

利用百分比,移动到view的中心进行缩放


image

利用百分数+p,设置缩放原点

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

利用百分数+p 移动缩放点左右都移动父view的一半,然后进行缩放。



类似投影方式,缩放原点和最终图片的关系:


image

代码实现

ScaleAnimation scaleAnimation = new ScaleAnimation(0.0f, 2.0f, 0.0f, 2.0f);
scaleAnimation.setDuration(3000);
scaleAnimation.setFillAfter(true);
mTVDemo.startAnimation(scaleAnimation);

4 RotateAnimation 旋转动画

构造函数

RotateAnimation(Context context, AttributeSet attrs)
RotateAnimation(float fromDegrees, float toDegrees)
RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY)
RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)

参数说明

  • fromDegrees 开始旋转的角度,正值顺时针,负值逆时针
  • toDegrees 结束时旋转到的角度,正值顺时针,负值逆时针
  • pivotX 旋转起点X轴坐标,可以是数值、百分数、百分数p 和上面的类似规则一样,左上角为坐标原点。
  • pivotY 旋转起点Y轴坐标,可以是数值、百分数、百分数p
  • pivotXType,pivotYType 类似和其他动画类含义类似。

XML方式实现:
实现view从0度顺时针旋转270度,坐标原点为view左上角(0,0)

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0"
    android:toDegrees="270"
    android:pivotX="0"
    android:pivotY="0"
    android:duration="3000"
    android:fillAfter="true">
</rotate>
image

利用百分数,修改坐标原点为view的中心点

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

绕中心旋转


image

代码实现:

RotateAnimation rotateAnimation = new RotateAnimation(0.0f, 270f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setDuration(3000);
rotateAnimation.setFillAfter(true);
mTVDemo.startAnimation(rotateAnimation);

5 AnimationSet 联合动画

animationSet继承自Animation没有自己的属性完全继承父类,但是有些属性对它无效,属性说明:

  • duration, repeatMode, fillBefore, fillAfter: 这些属性设置给了AnimationSet会作用于它内部的Animation对象.
  • repeatCount, fillEnabled: 这些属性对AnimationSet无效,将被忽略.
  • startOffset, shareInterpolator: 这些属性只作用于AnimationSet.

构造函数
AnimationSet(Context context, AttributeSet attrs)
AnimationSet(boolean shareInterpolator) shareInterpolator取值为true时,指在AnimationSet中定义一个插值器(interpolater),它下面的所有动画共同使用,为false,则各自定义插值器。

常用方法:添加动画:
public void addAnimation (Animation a)

XML方式实现动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:fillAfter="true">
    <translate
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="100"
        android:toYDelta="100" />
    <alpha
        android:fromAlpha="0.5"
        android:toAlpha="1.0" />

    <scale
        android:fromXScale="0.0"
        android:fromYScale="0.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="2.0"
        android:toYScale="2.0" />
    <rotate
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="-270" />
</set>
image

代码实现

AnimationSet animationSet = new AnimationSet(true);
animationSet.addAnimation(alphaAnimation);
animationSet.addAnimation(scaleAnimation);
animationSet.addAnimation(rotateAnimation);
mTVDemo.startAnimation(animationSet);

Animation动画概述和执行原理
Android动画之补间动画TweenAnimation
Android动画之逐帧动画FrameAnimation
Android动画之插值器简介和系统默认插值器
Android动画之插值器Interpolator自定义
Android动画之视图动画的缺点和属性动画的引入
Android动画之ValueAnimator用法和自定义估值器
Android动画之ObjectAnimator实现补间动画和ObjectAnimator自定义属性
Android动画之ObjectAnimator中ofXX函数全解析-自定义Property,TypeConverter,TypeEvaluator
Android动画之AnimatorSet联合动画用法
Android动画之LayoutTransition布局动画
Android动画之共享元素动画
Android动画之ViewPropertyAnimator(专用于view的属性动画)
Android动画之Activity切换动画overridePendingTransition实现和Theme Xml方式实现
Android动画之ActivityOptionsCompat概述
Android动画之场景变换Transition动画的使用
Android动画之Transition和TransitionManager使用
Android动画之圆形揭露动画Circular Reveal
Android 动画之 LayoutAnimation 动画
Android动画之视图动画的缺点和属性动画的引入

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容