【动画系列】视图动画

来源:互联网 发布:数据使用安全保密协议 编辑:程序博客网 时间:2024/04/30 05:21

这里写图片描述

一.渐变:alpha

xml实现小例子

透明度控制动画效果 alpha        浮点型值:        fromAlpha 属性为动画起始时透明度        toAlpha   属性为动画结束时透明度        说明:         0.0表示完全透明        1.0表示完全不透明                     以上值取0.0-1.0之间的float数据类型的数字        长整型值:        duration  属性为动画持续时间        说明:                          时间以毫秒为单位
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <alpha        android:fromAlpha="1.0"        android:toAlpha="0.0"        android:duration="3000"/></set>
        // 简单动画,渐变        // xml实现        final Button button1 = (Button) findViewById(R.id.btn1);        button1.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Animation animation = AnimationUtils.loadAnimation(SimpleActivity.this, R.anim.simple_1);                button1.startAnimation(animation);            }        });

代码实现小例子

// 代码实现视图动画(视图动画不建议使用代码编写,动画重用性不高,实用性低)        findViewById(R.id.btn111).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                AnimationSet animationSet = new AnimationSet(true);                // 每个动画效果,所带参数也各不相同,开发者需要自己查看开发文档                AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);                // 设置动画时间                alphaAnimation.setDuration(3000);                // 将alphaAnimation加入到动画序列中                animationSet.addAnimation(alphaAnimation);                // 为某个控件View添加动画                linearLayout.startAnimation(animationSet);            }        });

二.旋转:rotate

rotate可以实现旋转的动画效果,主要的属性如下:

android:duration 动画从开始到结束持续的时长,单位为毫秒
android:fromDegrees 旋转开始的角度
android:toDegrees 旋转结束的角度
android:pivotX 缩放起点X坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)

android:pivotY 缩放起点Y坐标,同上规律

以下示例代码旋转角度从0到360,即旋转了一圈,旋转的中心点都设为了50%,即是View本身中点的位置。

xml实现小例子

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <rotate        android:interpolator="@android:anim/accelerate_decelerate_interpolator"        android:fromDegrees="0" 初始角度        android:toDegrees="90" 结束角度        android:pivotX="50%" x方向的旋转中心        android:pivotY="50%" y方向上的旋转中心        android:duration="3000"/></set>
// 旋转动画        final Button button2 = (Button) findViewById(R.id.btn2);        button2.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Animation animation = AnimationUtils.loadAnimation(SimpleActivity.this, R.anim.simple_2);                button2.startAnimation(animation);            }        });

代码实现小例子

三.缩放 scale

scale可以实现缩放的动画效果,主要的属性如下:

android:duration 动画从开始到结束持续的时长,单位为毫秒
android:fromXScale 初始X轴缩放比例
android:toXScale 结束X轴缩放比例
android:fromYScale 初始Y轴缩放比例
android:toYScale 结束Y轴缩放比例
PS:以上四个属性,0.0表示缩放到没有,1.0表示正常无缩放,小于1.0表示收缩,大于1.0表示放大

android:pivotX 缩放起点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)

android:pivotY 缩放起点Y轴坐标,同上规律

xml实现小例子

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <scale        android:interpolator="@android:anim/accelerate_decelerate_interpolator"        android:fromXScale="1.0"        android:toXScale="0.5"        android:fromYScale="1.0"        android:toYScale="0.5"        android:pivotY="50%"        android:pivotX="50%"        android:duration="500"        android:repeatCount="0"        android:startOffset="500"        /></set>
        // 缩放动画        final Button button3 = (Button) findViewById(R.id.btn3);        button3.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Animation animation = AnimationUtils.loadAnimation(SimpleActivity.this, R.anim.simple_3);                button3.startAnimation(animation);            }        });

代码实现小例子

简单,略

四.位移动画translate

  translate可以实现位置移动的动画效果,可以是垂直方向的移动,也可以是水平方向的移动。坐标的值可以有三种格式:从-100到100,以”%”结束,表示相对于View本身的百分比位置;如果以”%p”结束,表示相对于View的父View的百分比位置;如果没有任何后缀,表示相对于View本身具体的像素值。主要的属性如下:

android:duration 动画从开始到结束持续的时长,单位为毫秒
android:fromXDelta 起始点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
android:toXDelta 结束点X轴坐标,同上规律
android:fromYDelta 起始点Y轴从标,同上规律
android:toYDelta 起始点Y轴从标,同上规律

说明:
这些坐标可能不太好理解,但是可以一维一维的看,比如固定x轴,只调整y轴的坐标,一维一维的调整。

xml实现小例子

布局

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android">    <translate        android:interpolator="@android:anim/accelerate_decelerate_interpolator"        android:fromXDelta="50%"        android:toXDelta="0"        android:fromYDelta="0"        android:toYDelta="0"        android:duration="3000"        /></set>

触发

        // 移动动画        final Button button4 = (Button) findViewById(R.id.btn4);        button4.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Animation animation = AnimationUtils.loadAnimation(SimpleActivity.this, R.anim.simple_4);                linearLayout.startAnimation(animation);            }        });

代码实现小例子

简单,略

动画集合(AnimationSet)

  set标签定义的是动画集,它可以包含多个其他标签,也可以嵌套set标签。默认情况下,所有动画会同时播放;如果想按顺序播放,则需要指定startOffset属性;另外,还可以通过设置interpolator改变动画变化的速率,比如匀速、加速。

公共属性

1.fillAfter
有的时候,在xml文件中使用动画的fillAfter和fillBefore属性,会没有任何效果。后来在stackoverflow上发现了相关解答。
对于fillAfter和fillBefore属性的使用,只有以下两种方式有效果:

在代码中使用

animation.setFillEnabled(true);animation.setFillAfter(true);

在xml文件的根标签中使用

单个动画是根标签

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

动画集是根标签

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

2.startOffset
如果想按顺序播放,则需要指定startOffset属性;
android:startOffset 设置动画执行之前的等待时长,毫秒为单位;重复执行时,每次执行前同样也会等待一段时间

3.android:interpolator
可以通过设置interpolator改变动画变化的速率,比如匀速、加速

4.android:shareInterpolator
set标签还有个android:shareInterpolator属性,设置为true时则可将interpolator应用到所有子元素中

5.android:fillBefore 设置为true时,动画执行完后,View回到动画执行前的状态,默认即为true
android:fillEnabled 设置为true时,android:fillBefore的值才有效,否则android:fillBefore会被忽略
android:repeatCount 设置动画重复执行的次数,默认为0,即不重复;可设为-1或infinite,表示无限重复
android:repeatMode 设置动画重复执行的模式,可设为以下两个值其中之一:restart 动画重复执行时从起点开始,默认为该值;reverse 动画会反方向执行。

Interpolator

  通过interpolator可以定义动画速率变化的方式,比如加速、减速、匀速等,每种interpolator都是 Interpolator 类的子类,Android系统已经实现了多种interpolator,对应也提供了公共的资源ID,如下表:

具体参考:

这里写图片描述

  如果系统提供的以上Interpolator还不符合你的效果,也可以自定义。自定义的方式有两种,一种是通过继承 Interpolator 父类或其子类;另一种是通过自定义的xml文件,可以更改上表中Interpolator的属性。自定义的xml文件需存放于res/anim/目录下,根标签与上表相应的有九种如下:

accelerateDecelerateInterpolator 在动画开始与结束时速率改变比较慢,在中间的时候加速。没有可更改设置的属性,所以设置的效果和系统提供的一样
accelerateInterpolator在动画开始时速率改变比较慢,然后开始加速。有一个属性可以设置加速的速率

android:factor 浮点值,加速的速率,默认为1
anticipateInterpolator动画开始的时候向后然后往前抛。有一个属性设置向后拉的值

android:tension 浮点值,向后的拉力,默认为2,当设为0时,则不会有向后的动画了
anticipateOvershootInterpolator动画开始的时候向后然后向前抛,会抛超过目标值后再返回到最后的值。可设置两个属性

android:tension 浮点值,向后的拉力,默认为2,当设为0时,则不会有向后的动画了
android:extraTension 浮点值,拉力的倍数,默认为1.5(2*1.5),当设为0时,则不会有拉力了
bounceInterpolator动画结束的时候会弹跳。没有可更改设置的属性
cycleInterpolator动画循环做周期运动,速率改变沿着正弦曲线。有一个属性设置循环次数

android:cycles 整数值,循环的次数,默认为1
decelerateInterpolator在动画开始时速率改变比较快,然后开始减速。有一个属性设置减速的速率

android:factor 浮点值,减速的速率,默认为1
linearInterpolator动画匀速播放。没有可更改设置的属性

overshootInterpolator动画向前抛,会抛超过最后值,然后再返回。有一个属性

android:tension 浮点值,超出终点后的拉力,默认为2

视图动画的原理

https://www.ibm.com/developerworks/cn/opensource/os-cn-android-anmt1/

总结

1.两种写法(根据场景而定),到底是选择代码来书写,还是选择xml来书写,需要根据具体的应用场景。不过一般视图动画不建议使用代码编写,动画重用性不高,实用性低。

2.view动画的特殊使用场景

在viewgroup中可以控制子元素的出场效果LayoutAnimation
在activity中可以实现不同activity之间的切换效果
Activity overridePendingTransition
Fragment FragmentTransation.setCustomAnimations

3.view动画的监听器
AnimationListener

4.自定义view动画比较难,但是知识点比较偏,略过。

5.Animation类的方法

这里写图片描述

6.既然补间动画只能给View使用,那就来看看View中和动画相关的几个常用方法

这里写图片描述

7.特别特别注意:补间动画执行之后并未改变View的真实布局属性值。切记这一点,譬如我们在Activity中有一个Button在屏幕上方,我们设置了平移动画移动到屏幕下方然后保持动画最后执行状态呆在屏幕下方,这时如果点击屏幕下方动画执行之后的Button是没有任何反应的,而点击原来屏幕上方没有Button的地方却响应的是点击Button的事件。

8.-180读,是初始就是0–180度,0,-1等等

0 0
原创粉丝点击