android动画

转载出自: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自定义
  1. 在res/anim/目录下创建xml文件
  2. 修改
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
    android:attribute_name="value"
    />
  1. 在你的补间动画中引用该文件
    在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

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