Android动画开发精要

3个分类

View 动画, 属性动画, 帧动画

View动画(android 3.0以下使用) TranslateAnimation

只支持4种类型的动画, 平移(TranslateAnimation), 缩放(ScaleAnimation), 旋转(RotateAnimation), 透明度(AlphaAnimation). 因此有些效果实现不了.
4种类型共同的父类是: Animation.

在xml中使用, 也可以在代码中使用.

xml的定义位置: res/anim

使用view动画的核心: 每个view都提供了setAnimation API. framework同时提供了工具类AnimationUtils加载xml中的动画文件.

view.startAnimation(animation);
//或者这样
view.setAnimation(animation);
animation.start();

代码:
Popup_menu.java

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        JLog.i();
        Animation animation = AnimationUtils.loadAnimation(mContext,R.anim.view_animation_demo);
        menu_download.setAnimation(animation);
        animation.start();
    }

res/anim/view_animation_demo.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="0"
        android:toXDelta="200"
        android:duration="300" />
</set>
属性动画 ObjectAnimator

为什么叫属性动画? 因为实现原理是在一段时间内通过持续改变一个对象的属性值的方式, 实现动画的效果.

Android 3.0以后新引入的, 对于低版本手机, 可使用兼容包nineoldandroid去使用属性动画.

实现原理是: 给对象指定要改变的属性名字以及开始值和结束值, 因此在类中必须有其对应的get和set方法. ObjectAnimator通过反射的方式, 持续调用这个属性的set方法, 设置新的值给该属性, 从而实现动画的效果.

代码:

    TextView menu_download;
    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(menu_download, "translationX", 0, 300);
        objectAnimator.start();
    }

以动画的方式, 持续调用setTranslationX()方法, 改变menu_download对象的"translationX"属性的值.

public class View {
    public void setTranslationX(float translationX) {
    }
}

ValueAnimator和ObjectAnimator的区别

父子继承关系.
public final class ObjectAnimator extends ValueAnimator

使用区别:

ValueAnimator.ofInt()方法中没有object参数, 动画修改的是"数字", 不直接作用于某个对象.

因此使用ValueAnimator完成动画, 还要配合上update listener才行.

代码:

CircleLoadingView.java
public void startAnim() {
        startViewAnim(0.0f, 1.0f, 1000);
}

private ValueAnimator startViewAnim(float startF, final float endF, long time) {
        valueAnimator = ValueAnimator.ofFloat(startF, endF);

        valueAnimator.setDuration(time);
        valueAnimator.setInterpolator(new LinearInterpolator());
        valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
        valueAnimator.setRepeatMode(ValueAnimator.RESTART);

        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {

                float value = (float) valueAnimator.getAnimatedValue();
                startAngle = 360 * value;
                invalidate();
            }
});

@Override
protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        mPaint.setColor(Color.argb(0, 0, 0, 0));
        canvas.drawCircle(mWidth / 2, mWidth / 2, mWidth / 2 - mPadding, mPaint);
        mPaint.setColor(getColor());
        rectF = new RectF(mPadding, mPadding, mWidth - mPadding, mWidth - mPadding);
        canvas.drawArc(rectF, startAngle, 270, false, mPaint);
    }
View动画和属性动画选谁

优先选择属性动画,
因为一是属性动画可以支持更多的动画效果, 只要这个属性名字在类中有set和get方法即可.
例如改变TextView的宽度, 就只有属性动画可以做到. View动画的ScaleAnimation只是缩放, 会把TextView里面的内容也一起进行缩放, 不满足需求.
二是因为View动画实施后并不改变View的实际位置, 因此在新位置点击不到view, view的点击事件还是发生在初始位置, 在大多数情况下, 这么做是不符合用户预期的.

帧动画 AnimationDrawable

耗费内存, 因此不建议使用.

通过给view设置背景的方式实现.

frame.xml中

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
  android:oneshot="false">
  <item android:drawable="@drawable/f1" android:duration="300" />
  <item android:drawable="@drawable/f2" android:duration="300" />
  <item android:drawable="@drawable/f3" android:duration="300" />
  <item android:drawable="@drawable/f4" android:duration="300" />
</animation-list>

java代码:

    image = (ImageView) findViewById(R.id.frame_image);
    image.setBackgroundResource(R.anim.frame);
    AnimationDrawable anim = (AnimationDrawable) image.getBackground();
    anim.start();

--------DONE.--------------------

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

推荐阅读更多精彩内容

  • 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今...
    未聞椛洺阅读 2,685评论 0 10
  • Animation Animation类是所有动画(scale、alpha、translate、rotate)的基...
    四月一号阅读 1,898评论 0 10
  • 刚来大学的有段时间,秦清凌喜欢看日出,多彩的余晖倒映在她黑白分明的眼底,反射出一丝白皙。 就是那时候,她开...
    雨田人圭阅读 227评论 0 0
  • 第一次去台湾,是和公司小伙伴一起去哒。 第一天到达高雄的时候,看见几乎所有人都戴着口罩,我就问出租车司机,为什么都...
    慢多拍的小球阅读 323评论 6 7
  • 我现在叫着的哥哥是我的一年多的男朋友,在崇州,那个天空之城同居时,形成的习惯。每当我要撒娇,要向他展现我身为小女人...
    坚果酱紫阅读 298评论 0 0