您的位置:首页 > 其它

动画——视图动画(View Animation)

2017-11-15 17:51 337 查看

动画——View Animation

简介:

视图动画又称补间动画,是android中比较古老的一种动画,补间动画执行完以后

并没有改变View的真是位置属性。

AlphaAnimation:透明度动画

xml属性Java方法解释
android:fromAlphaAlphaAnimation(float)开始的透明度
android:toAlphaAlphaAnimation(float)结束的透明度
RotateAnimation:旋转动画

xml属性Java方法解释
android:fromDegreesRotateAnimation(float)开始旋转的角度,正表示顺时针
android:toDegreesRotateAnimation(float)结束旋转的角度
android:pivotXRotateAnimation(float)放缩起点X坐标(可以是数值、百分数、百分数p)
android:pivotYRotateAnimation(float)同上:数值表示加多少px作为起点,百分数表示等比扩大
ScaleAnimation:伸缩动画

xml属性Java方法解释
android:fromXScaleScaleAnimation 的构造函数起始时X轴放缩比例
android:toXScaleScaleAnimation 的构造函数结束时X放缩比例
android:fromYScaleScaleAnimation 的构造函数起始时Y轴放缩比例
android:toYScaleScaleAnimation 的构造函数结束时Y放缩比例
android:pivotXScaleAnimation 的构造函数放缩起点X坐标(可以是数值、百分数)
android:pivotYScaleAnimation 的构造函数同上:数值表示加多少px作为起点,百分数表示等比扩大
TranslateAnimation:位移动画

xml属性Java方法解释
android:fromXDeltaTranslateAnimation 的构造函数起始时X轴坐标
android:toXDeltaTranslateAnimation 的构造函数结束时X放缩坐标
android:fromYDeltaTranslateAnimation 的构造函数起始时Y轴坐标
android:toYDeltaTranslateAnimation 的构造函数结束时Y轴坐标
数值说明:坐标点可以是数值x,百分数x%,或者是百分数x%p

数值x:表示以当前View左上角坐标加xpx为初始点

百分数x%:表示以当前View的左上角加上当前View宽高的50%做为初始点

百分数x%p:以当前View的左上角加上父控件宽高的50%做为初始点

AnimationSet:混合动画

是四种动画的组合,没有自己的属性,在xml中使用的是set标签

以上动画的基类:Animation

位于android.view.animation包下,主要的属性:

xml属性Java方法解释
android:detachWallpapersetDetachWallpaper是否在壁纸上运行
android:durationsetDuration(long)动画持续时间,毫秒为单位
android:fillAftersetFillAfter(boolean)动画结束时是否保持动画最后状态
android:fillBeforesetFillBefore(boolean)动画结束时是否保持开始前的状态
android:fillEnabledsetFillEnabled(boolean)与android:fillBefore效果相同
android:interpolatorsetInterpolator(Interpolator)设定插值器(指定的动画效果,譬如回弹等)
android:repeatCountsetRepeatCount(int)重复次数
android:repeatModesetRepeatMode(int)重复类型:restart重头开始;reverse:倒序开始
android:startOffsetsetStartOffset(long)调用开始后等待的时间
android:zAdjustmentsetZAdustment(int)Z轴上的位置
基类:Animation的类方法

除去很多的get、set以及重写的方法以后

Animation类的方法解释
reset()重置Animation的初始化
cancel()取消Animation动画
start()开始Animation动画
setAnimationListener(AnimationListener listener))给当前Animation设置动画监听
hasStarted()是否开始
hasEnded()是否结束
View中操作动画的方法

startAnimation(Animation animation):开始动画

clearAnimation():清除动画

Interpolator插值器详解

Java类xml id解释
AccelerateDecelerateInterpolator@android:anim/accelerate_decelerate_interpolator动画始末速率较慢,中间加速
AccelerateInterpolator@android:anim/accelerate_interpolator加速度
AnticipateInterpolator@android:anim/anticipate_interpolator开始的时候从后向前甩
AnticipateOvershootInterpolator@android:anim/anticipate_overshoot_interpolator类似上面
BounceInterpolator@android:anim/bounce_interpolator类似真是的弹跳效果
CycleInterpolator@android:anim/bounce_interpolator循环播放速率改变为正弦曲线
DecelerateInterpolator@android:anim/decelerate_interpolator减速度
LinearInterpolator@android:anim/linear_interpolator匀速
OvershootInterpolator@android:anim/overshoot_interpolator向前弹出一定值之后回到原来位置
PathInterpolator新增,定义路径坐标后按照路径坐标来跑。
实例:

anim:view_animation1

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:interpolator="@android:anim/overshoot_interpolator"
android:shareInterpolator="true"
>

<alpha android:fromAlpha="0.5"
android:toAlpha="1"/>

<rotate android:fromDegrees="0"
android:toDegrees="500"
android:pivotY="100"/>

<translate android:fromXDelta="0"
android:toXDelta="500"
/>

</set>


自定义插值器

概述:

原理:根据动画的进度,计算当前属性值的百分比。

具体操作:方法一:通过xml重设已有插值器的某些属性,这种方法的自定义比较有限。

方法二:通过Java代码实现Interpolator\TimeInterpolator接口,并重写getInterpolator(float input)

方法,input的范围是[0,1]。补间动画实现Interpolator接口,属性动画实现TimeInterpolator接口。

TimeInterpolator接口是属性动画中新增的,用于兼容Interpolator接口,这使得所有过去的Interpolator

实现类都可以直接在属性动画使用。

xml法定义

使用步骤:

在res/anim/目录下创建filename.xml文件。

修改你准备自定义的插值器如下:

<?xml version="1.0" encoding="utf-8"?>

<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"

android:attribute_name="value"/>


在你的补间动画文件中引用该文件即可。

accelerateDecelerateInterpolator:无可自定义的attribute。

accelerateInterpolator:android:factor 浮点值,加速速率(默认值为1)

anticipateInterpolator:android:tension 浮点值,起始点后拉的张力数(默认值为2)

anticipateOvershootInterpolator:android:tension 浮点值,起始点后拉的张力数(默认值为2)。

android:extraTension 浮点值,拉力的倍数(默认值为1.5)。

bounceInterpolator:无可自定义的attribute。

cycleInterpolator:android:cycles 整形,循环的个数(默认为1)。

decelerateInterpolator:android:factor 浮点值,减速的速率(默认为1)。

linearInterpolator:无可自定义属性

overshootInterpolator:android:tension 浮点值,超出终点后的张力(默认为2)

java代码自定义插值器:

内置插值器解析:

public class AccelerateDecelerateInterpolator implements Interpolator, NativeInterpolatorFactory {

// 仅贴出关键代码

...

public float getInterpolation(float input) {

return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;

// input的运算逻辑如下:

// 使用了余弦函数,因input的取值范围是0到1,

//那么cos函数中的取值范围就是π到2π。

// 而cos(π)的结果是-1,cos(2π)的结果是1

// 所以该值除以2加上0.5后,getInterpolation()方法最终返回的

//结果值还是在0到1之间。只不过经过了余弦运算之后,最终的

//结果不再是匀速增加的了,而是经历了一个先加速后减速的过程

// 所以最终,fraction值 = 运算后的值 = 先加速后减速

// 所以该差值器是先加速再减速的

}

}


自定义插值器:

public class DecelerateAccelerateInterpolator implements Interpolator {

@Override

public float getInterpolation(float input) {

float result;

if (input <= 0.5) {

result = (float) (Math.sin(Math.PI * input)) / 2;

// 使用正弦函数来实现先减速后加速的功能,逻辑如下:

// 因为正弦函数初始弧度变化值非常大,刚好和余弦函数是相反的

// 随着弧度的增加,正弦函数的变化值也会逐渐变小,这样也就实现了减速的效果。

// 当弧度大于π/2之后,整个过程相反了过来,现在正弦函数的弧度变化值非常小,

// 渐渐随着弧度继续增加,变化值越来越大,弧度到π时结束,这样从0过度到π,

// 也就实现了先减速后加速的效果

} else {

result = (float) (2 - Math.sin(Math.PI * input)) / 2;

}

return result;

// 返回的result值 = 随着动画进度呈先减速后加速的变化趋势

}

}


致谢:

http://blog.csdn.net/yanbober/article/details/46481171

http://blog.csdn.net/carson_ho/article/details/72863901
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: