android animator

参考
属性动画
Android源码分析—属性动画的工作原理

一、view动画
  • TranslateAnimation
  • ScaleAnimation
  • RotateAnimation
  • AlphaAnimation

建议使用XML来定义动画,可读性比较好

//res/anim/animation_test.xml
...
<translate
   android:duration = "100"
   android:fromXDelta = "0"
   android:fromYDelta = "0"
   android:interpolator = "@android:anim/linear_interpolator"//插值器
   android:toXDelta = "100"
   android:toYDelta = "100"/>
<rotate
   android:duration = "100"
   android:fromDegrees = "0"
   android:toDegrees = "90"/>

如何应用上面的动画呢

Button mButton = (Button)findViewById(R.id.buttton1);
Animation animation = AnimationUtils.
loadAnimation(this,R.anim.animation_test);
mButton.startAnimation(animation);
  • view动画只能控制view对象
  • view动画只有平移缩放旋转淡入淡出效果
  • view动画只是对影像做动画 交互事件容易出问题
二、帧动画

使用AnimationDrawable。帧动画容易引起OOM,尽量避免使用过多尺寸较大的图片

//res/drawable/frame_animation.xml
...
<item android:drawable = "@drawable/image1" android:duration="500"/>
<item android:drawable = "@drawable/image2" android:duration="500"/>
...
Button mButton = (Button)findViewById(R.id.button1);
mButton.setBackgroundResource(R.drawable.frame_animation);
AnimationDrawable drawable = (AnimationDrawable) mButton.getBackground();
drawable.start();
三、属性动画

android3.0,api11之后才有属性动画。默认帧率10ms/帧,动画默认时间间隔300ms。

  • ValueAnimator
//三秒内颜色渐变,无限循环且反复
ValueAnimator colorAnim = ObjectAnimator.ofInt(this,
"backgroundColor",/\*Red\*/0xffff8080,/\*Blue\*/0xff8080ff);
colorAnim.setDuration(3000);
colorAnim.setEvaluator(new ArgbEvaluator());
colorAnim.setRepeatCount(ValueAnimator.INFINITE);
colorAnim.setRepeatMode(ValueAnimator.REVERSE);
colorAnim.start();
//测试数值0到1的变化
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);  
anim.setDuration(300);  
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  
    @Override  
    public void onAnimationUpdate(ValueAnimator animation) {  
        float currentValue = (float) animation.getAnimatedValue();  
        Log.d("TAG", "cuurent value is " + currentValue);  
    }  
});  
anim.start();  
  • 继承自ValueAnimator的ObjectAnimator
ObjectAnimator.ofFloat(myObject,"translationY",
-myObject.getHeight()).start();//向上平移他的高度
  • AnimatorSet 动画集合
    5秒内对view的旋转、平移、缩放和透明度都进行了改变。
AnimatorSet set = new AnimatorSet();
set.playTogether(
   ObjectAnimator.ofFloat(myView,"rotationX",0,360),
   ObjectAnimator.ofFloat(myView,"rotationY",0,180),
   ObjectAnimator.ofFloat(myView,"rotation",0,-90),
   ObjectAnimator.ofFloat(myView,"translationX",0,90),
   ObjectAnimator.ofFloat(myView,"translationY",0,90),
   ObjectAnimator.ofFloat(myView,"scaleX",1,1.5f),
   ObjectAnimator.ofFloat(myView,"scaleY",1,1.5f),
   ObjectAnimator.ofFloat(myView,"alpha",1,0.25f,1)
);
set.setDuration(5*1000).start();
四、让一个Button宽度从当前宽度增加到500px
  • 方式一:使用view动画,拉伸的只是影像,背景图和文字都会变形。
  • 方式二:
    <pre>
    public void onClick(View v){
    if(v == Button){
    performAnimate();
    }
    }
    private void performAnimate(){
    ObjectAnimator.ofInt(mButton,"width",500).setDuration(5000).start();
    }
    </pre>
    这样是无效的,object会不停地调用set方法,但是button的setWidth由于继承自TextView,其设置的是最大宽度和最小宽度,真正起作用的是width.
  • 方式三:
    将方式二包装一下
    <pre>
    private static class ViewWrapper{
    private View mTarget;
    public ViewWrapper(View target){
    mTarget = target;
    }
    public int getWidth(){
    return mTarget.getLayoutParams().width;
    }
    public void setWidth(int width){
    mTarget.getLayoutParams().width = width;
    mTarget.requestLayout();
    }
    private void performAnimate(){
    ViewWrapper wrapper = new ViewWrapper(mButton);
    ObjectAnimator.ofInt(wrapper,"width",500).setDuration(5000).start();
    }
    }
    </pre>
  • 方式四:
    使用ValueAnimator
private void performAnimate(final View target,final int start,final int end){
   ValueAnimator valueAnimator = ValueAnimator.ofInt(1,100);//动画过程中从1变成100
   valueAnimator.addUpdateListener(
      new AnimatorUpdateListener(){
         //持有一个IntEvaluator对象,方便下面估值时使用
         private IntEvalluator mEvaluaotr = new IntEvalluator();
         
         public void onAnimationUpdate(ValueAnimator animation){
            int currentValue = (Integer)animator.getAnimatedValue();//1~100间
            float fraction = animator.getAnimatedFraction();//当前进度,0~1间
            target.getLayoutParams().width = mEvaluaotr.
            evaluate(fraction,start,end);
            target.requestLayout();
        }
      }
   );
   valueAnimator.setDuration(5000).start();
}
performAnimate(mButton,mButton.getWidth(),500);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容