转载出自:http://www.cnblogs.com/ldq2016/
Android动画
- View Animation 视图动画,只能用来设置View的动画
- Drawable Animation 帧动画(Frame动画),一帧帧地显示资源文件中的Drawable
- Property Animation 属性动画,在android3.0以上的系统才有。这动画可以设置给任何的Object,包括那些还没有渲染到屏幕的view.
View Animation 视图动画
视图动画也叫补间动画,指在一个视图容器中执行一些变换。包含有:位置、大小、旋转、透明
补间动画一般一般通过xml实现,不建议是用android代码实现,因为代码实现的可读性比较差。
补间动画的相关类
- AlphaAnimation <alpha>放在res/anim/目录下 透明渐变动画效果
- RotateAnimation <rotate>放在res/anim/目录下 旋转转移动画效果
- ScaleAnimation <scale>放在res/anim/目录下 缩放动画效果
- TranslateAnimation <translate>放在res/anim/目录下 移动动画效果
- AnimationSet <set> 放在res/anim/目录下 持有动画的容器
Animation属性详解
xml属性 | java方法 | 解释 |
---|---|---|
android:detachWallpaper | setDetachWallpaper(boolean) | 是否在壁纸上运行 |
android:duration | setDuration(long) | 动画持续时间(毫秒) |
android:fillAfter | setFillAfter(boolean) | 动画结束时是否保持动画最后的状态 |
android:fillBefore | setFillBefore(boolean) | 动画结束时是否还原到动画开始的状态 |
android:fillEnable | setFillEnable(boolean) | 与fillBefore效果相同 |
android:interpolator | setInterpolator(Interpolator) | 指定动画效果(插值器) |
android:repeatCount | setRepeatCount(int) | 重复次数 |
android:repeatMode | setRepeatMode(int) | 设置重复类型,reverse倒序 restart从头 |
android:startOffset | setStartOffset(long) | star开始后等待开始播放的时间 |
android:zAdjustment | setZAdjustment(int) | 动画的内容运行时在z轴上的位置(top/bottom/normal) 默认normal |
Alpha属性详解
xml属性 | java方法 | 解释 |
---|---|---|
android:fromAlpha | AlphaAnimation(float fromAlpha,...) | 动画开始的透明度(0.0到1.0) |
android:toAlpha | AlphaAnimation(...,float toAlpha) | 动画结束的透明度 |
Rotate属性详解
xml属性 | java方法 | 解释 |
---|---|---|
android:fromDegrees | RotateAnimation(float fromDegrees,...) | 旋转开始角度,正顺时针,负逆时针 |
android:toDegrees | RotateAnimation(...,float toDegrees,...) | 旋转结束角度,正顺时针,负逆时针 |
android:pivotX | RotateAnimation(...,floate pivotX,...) | 缩放起点X坐标(数值、百分数、百分数p,例如50表示以当前view左上角坐标加50px为初始点,50%表示以当前view左上角坐标加上当前view的宽高的50%做为初始点,50%p表示以当前view左上角加上父控件宽高的50%做为初始点) |
android:pivotY | RotateAnimation(...,float pivotY) | 缩放起点Y的坐标,与X的规律一样 |
Scale属性详解
xml属性 | java方法 | 解释 |
---|---|---|
android:fromXScale | ScaleAnimation(float fromX,...) | 初始x轴缩放比例,1.0表示无变化 |
android:toXScale | ScaleAnimation(...,float toX,...) | 结束x轴缩放比例 |
android:fromYScale | ScaleAnimation(...,float fromY,...) | 初始Y轴缩放比例 |
android:toYScale | ScaleAnimation(...,float toY,...) | 结束y轴缩放比例 |
android:pivotX | ScaleAnimation(...,floate pivotX,...) | 缩放起点X坐标(数值、百分数、百分数p,例如50表示以当前view左上角坐标加50px为初始点,50%表示以当前view左上角坐标加上当前view的宽高的50%做为初始点,50%p表示以当前view左上角加上父控件宽高的50%做为初始点) |
android:pivotY | ScaleAnimation(...,float pivotY) | 缩放起点Y的坐标,与X的规律一样 |
Translate属性详情
xml属性 | java方法 | 解释 |
---|---|---|
android:fromXDelta | TranslateAnimation(...,floate fromXDelta,...) | 起点X轴坐标(数值、百分数、百分数p,例如50表示以当前view左上角坐标加50px为初始点,50%表示以当前view左上角坐标加上当前view的宽高的50%做为初始点,50%p表示以当前view左上角加上父控件宽高的50%做为初始点) |
android:fromYDelta | TranslateAnimation(...,float fromYDelta) | 起点y轴坐标,与X的规律一样 |
android:toXDelta | TranslateAnimation(...,float toXDelta,...) | 结束点x轴坐标,同上规律 |
android:toYDelta | TranslateAnimation(...,float toYDelta) | 结束点y轴坐标,同上规律 |
AnimationSet详解
AnimationSet是集成Animation,是上面四种的组合容器类,没有自己的特性
补间动画的使用
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true" | "false"] >
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float" />
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
</set>
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.xxx);
image.startAnimation(hyperspaceJumpAnimation);
Animation常用方法 | 解释 |
---|---|
reset() | 重置Animation的初始化 |
cancel() | 取消Animation动画 |
start() | 开始Animation动画 |
setAnimationListener(AnimationListener listener) | 给当前Animation设置动画监听 |
hasStarted() | 判断Animation是否开始 |
hasEnded() | 判断Animation是否结束 |
view常用动画操作方法 | 解释 |
---|---|
startAnimation(Animation animation) | 对当前view开始设置Animation动画 |
clearAnimation() | 取消当前view正在执行的动画 |
注意一下,补间动画执行后并没有改变View的真实布局属性
插值器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 | 类似上面的AnticipateInterpolator |
BounceInterpolator | @android:anim/bounce_interpolator | 动画结速时弹起 |
CycleInterpolator | @android:anim/cycle_interpolator | 循环播放速率改成正弦曲线 |
DecelerateInterpolator | @android:anim/decelerate_interpolator | 动画开始快然后慢 |
LinearInterpolator | @android:anim/linear_interpolator | 动画匀速改变 |
OvershootInterpolator | @android:anim/overshoot_interpolator | 向前弹出一定值之后回到原来的位置 |
PathInterpolate | 新增,定义路径坐标后按照路径坐标 |
以上是系统提供的插值器
插值器的使用
<set android:interpolator="@android:anim/accelerate_interpolator">
</set>
插值器自定义
xml自定义
- 在res/anim/目录下创建xml文件
- 修改
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
android:attribute_name="value"
/>
- 在你的补间动画中引用该文件
在xml中,有些插值器是不具备修改属性,具体如下:
- <accelerateDecelerateInterpolator> 无可自定义的attribute
- <accelerateInterpolator> android:factor float 加速速率(默认为1)
- <anticipateInterpolator> android:tension float 起始点后拉的张力数(默认为2)
- <anticipateOvershootInterpolator> android:tension android:extraTension float 拉力的倍数
- <bounceInterpolator> 无可自定义的attribute
- <cycleInterpolator> android:cycle int 循环的个数(默认为1)
- <decelerateInterpolator> android:factor float 减速的速率(默认为1)
- <linearInterpolator> 无可自定义的attribute
- <overshootInterpolator> android:factor float 超出终点的张力(默认为2)
java自定义
java自定义插值器是xml的升级,所有的Interpolator都实现力Interpolator的接口,而Interpolator接口又继承自TimeInterpolator。TimeInterpolator接口定义了一个float getInterpolator(float input)方法,这个方法是由系统调用的,其中参数input代表动画的时间,在0和1之间,也就是开始和结束之间。
public class AccelerateDecelerateInterpolator extends BaseInterpolator
implements NativeInterpolatorFactory {
......
public float getInterpolation(float input) {
return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
}
......
}
Drawable动画(帧动画)
Drawable动画就是帧动画,它允许你实现像幻灯片一样的效果,这种动画的实质就是drawable.
Drawable动画的详细说明
推荐使用xml的方式实现
<animation-list>必须是根节点,包含一个或多个item属性有:
- android:oneshot true代表执行一次,false代表无限循环
- <item> 动画资源
<item> animation-list的子项,属性有: - android:drawable 动画资源文件
-android:duration 一帧显示多长时间
<!-- 注意:文件位于res/drawable/目录下 -->
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false" >
<item
android:drawable="@drawable/drawable_resource_name"
android:duration="100" />
</animation-list>
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();
AnimationDrawable的start()方法不能在Activity的onCreate方法中运行。因为AnimationDrawable还未完全附在window上,所以最好的时间是在onWindowFocusChanged
Property Animation(属性动画)
属性动画是在Android3.0之后引入的,主要是通过改变控件的属性来实现动画。
ObjectAnimation
继承自ValueAnimation,允许你指定要进行的动画对象以及对象的一个属性。该类会根据计算得到新的值自动更新属性。
objectAnimation类提供了ofInt,ofFloat,ofObject这三个常用的方法,这些方法都是设置动画作用的元素、属性、开始、结束等任意属性值。当属性值是一个参数时,就会通过getXX反射获取的值作为起点,设置的值作为终点;当属性值是两个参数时,一个是开始另一个是结束。
我们通常使用ObjectAnimation设置view的属性来生成动画,而一般View已知属性变化时会主动触发绘制,所以动画会自动实现;但是也有特殊情况,例如Object不是view,或者作用的属性没有触发重新绘制,或者我们在重绘时需要做自己的操作,可以通过一下的方法实现
ObjectAnimator mObjectAnimator= ObjectAnimator.ofInt(view, "customerDefineAnyThingName", 0, 1).setDuration(2000);
mObjectAnimator.addUpdateListener(new AnimatorUpdateListener()
{
@Override
public void onAnimationUpdate(ValueAnimator animation)
{
//int value = animation.getAnimatedValue(); 可以获取当前属性值
//view.postInvalidate(); 可以主动刷新
//view.setXXX(value);
//view.setXXX(value);
//......可以批量修改属性
}
});
PropertyValuesHolder
多属性动画同时工作管理类
PropertyValuesHolder a1 = PropertyValuesHolder.ofFloat("alpha", 0f, 1f);
PropertyValuesHolder a2 = PropertyValuesHolder.ofFloat("translationY", 0, viewWidth);
......
ObjectAnimator.ofPropertyValuesHolder(view, a1, a2, ......).setDuration(1000).start();
AnimationSet
动画集合,提供把多个动画组合成一个组合的机制,而且还可以设置动画的时序关系(同时播放,顺序播放,延迟播放)
ObjectAnimator a1 = ObjectAnimator.ofFloat(view, "alpha", 1.0f, 0f);
ObjectAnimator a2 = ObjectAnimator.ofFloat(view, "translationY", 0f, viewWidth);
......
AnimatorSet animSet = new AnimatorSet();
animSet.setDuration(5000);
animSet.setInterpolator(new LinearInterpolator());
//animSet.playTogether(a1, a2, ...); //两个动画同时执行
animSet.play(a1).after(a2); //先后执行
......//其他组合方式
animSet.start();
Interpolators
- AccelerateDecelerateInterpolator 先加速后减速
- AccelerateInterpolator 加速
- DecelerateInterpolate 减速
- AnticipateInterpolate 先向相反方向改变一段再加速播放
- AnticipateOvershootInterpolate 先向相反方向改变,再加速播放,超出目标后弹回
- BounceInterpolate 快到目标时跳跃
- CycleInterpolate 动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI * input)。
- LinearInterpolate 线性匀速
-OvershotInterpolate 最后超出目标值后缓慢改变到目标值 - TimeInterpolate 一个允许自定义Interpolator的接口,以上都实现了该接口
//开始很慢然后不断加速的插值器。
public class AccelerateInterpolator implements Interpolator {
private final float mFactor;
private final double mDoubleFactor;
public AccelerateInterpolator() {
mFactor = 1.0f;
mDoubleFactor = 2.0;
}
......
//input 0到1.0。表示动画当前点的值,0表示开头,1表示结尾。
//return 插值。值可以大于1超出目标值,也可以小于0突破低值。
@Override
public float getInterpolation(float input) {
//实现核心代码块
if (mFactor == 1.0f) {
return input * input;
} else {
return (float)Math.pow(input, mDoubleFactor);
}
}
}
Java属性动画拓展之ViewPropertyAnimator动画
public class View implements Drawable.Callback, KeyEvent.Callback,
AccessibilityEventSource {
......
/**
* This method returns a ViewPropertyAnimator object, which can be used to animate
* specific properties on this View.
*
* @return ViewPropertyAnimator The ViewPropertyAnimator associated with this View.
*/
public ViewPropertyAnimator animate() {
if (mAnimator == null) {
mAnimator = new ViewPropertyAnimator(this);
}
return mAnimator;
}
......
}
ViewPropertyAnimator提供了一种非常方便的方法为View的部分属性设置动画(切记,是部分属性),它可以直接使用一个 Animator对象设置多个属性的动画;在多属性设置动画时,它比 上面的ObjectAnimator更加牛逼、高效,因为他会管理多个属性的invalidate方法统一调运触发,而不像上面分别调用,所以还会有一些 性能优化
Java属性动画拓展之LayoutAnimator容器布局动画
Property动画系统还提供了对ViewGroup中View添加时的动画功能,我们可以用LayoutTransition对 ViewGroup中的View进行动画设置显示。LayoutTransition的动画效果都是设置给ViewGroup,然后当被设置动画的 ViewGroup中添加删除View时体现出来。该类用于当前布局容器中有View添加、删除、隐藏、显示等时候定义布局容器自身的动画和View的动 画,也就是说当在一个LinerLayout中隐藏一个View的时候,我们可以自定义 整个由于LinerLayout隐藏View而改变的动画,同时还可以自定义被隐藏的View自己消失时候的动画等。
LayoutTransition类中主要有五种容器转换动画类型,具体如下:
- LayoutTransition.APPEARING:当View出现或者添加的时候View出现的动画。
- LayoutTransition.CHANGE_APPEARING:当添加View导致布局容器改变的时候整个布局容器的动画。
- LayoutTransition.DISAPPEARING:当View消失或者隐藏的时候View消失的动画。
- LayoutTransition.CHANGE_DISAPPEARING:当删除或者隐藏View导致布局容器改变的时候整个布局容器的动画。
- LayoutTransition.CHANGE:当不是由于View出现或消失造成对其他View位置造成改变的时候整个布局容器的动画。
转载这篇文章,弥补了我的在动画上的欠缺。以前读一篇文章的时候都是快速浏览,一扫而过根本就没有认真阅读,有时间让自己静下心来读一篇文章收获还是漫漫的,再次感谢原作者
https://www.cnblogs.com/ldq2016/p/5407061.html