第7章 Android动画深入浅析

分类:View动画、帧动画、属性动画

View动画
四种效果,平移(TranslateAnimation)、缩放(ScaleAnimation)、旋转(RotateAnimation)、透明度(AlphaAnimation)。
都可以采用Java和XML,XML可读性更好。
    
    
    
    
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemes.android.com/apk/res/android"
  3. android:interpolator="@[package:]anim/interpolator_resource"//差值器
  4. android:shareInterpolator=["true"|"false"]>
  5. <alpha
  6. android:fromAlpha="float" //透明度起始值
  7. android:toAlpha="float"/> //透明度结束值
  8. <scale
  9. android:fromXScale="float" //水平方向缩放的起始值
  10. android:toXScale="float" //水平方向缩放的结束值
  11. android:fromYScale="float" //竖直方向缩放的起始值
  12. android:toYScale="float" //竖直方向缩放的结束值
  13. android:pivotX="float" //缩放的轴点x坐标,会影响缩放效果
  14. android:prvotY="float"/> //缩放的轴点y坐标,会影响缩放效果
  15. <translate
  16. android:fromXDelta="float" //x起始值
  17. android:toXDelata="float" //x结束值
  18. android:fromYDealta="float" //y的起始值
  19. android:toYDelata="float"/> //y的结束值
  20. <rotate
  21. android:fromDegrees="float" //旋转开始的角度
  22. android:toDegrees="float" //旋转结束的角度
  23. android:pivotX="float" //旋转的轴点x坐标
  24. android:prvotY="float"/> //旋转的轴点的y坐标
  25. </set>
另外还有常用属性
android:duration——持续时间
android:fillAfter——动画结束之后View是否停留在结束位置
使用XML的动画:
    
    
    
    
  1. Animation anim = AnimationUtils.loadAnimation(this,R.anim,animation);
  2. mBtn.startAnimation(anim);
Animation的setAnimationListener对View的动画做监听。

特殊View动画:
LayoutAnimation,为ViewGroup设置android:layoutAnimation属性;
Activity切换Animation,overridePendingTransition(R.anim.enter_anim,R.anim.exit_anim);

帧动画
顺序播放一组预先处理的图片,使用了AnimationDrawable。尽量避免大图片防止oom
标签采用<animation-list>。
    
    
    
    
  1. Button mBtn = (Button)findViewById(R.id.btn);
  2. mBtn.setBackgroundResource(R.drawable.fram_animation);
  3. AnimationDrawable drawable = (AnimationDrawable)mBtn.getBackground();
  4. drawable.start();

属性动画
Nineoldandroids兼容。常见的动画类:ValueAnimator、ObjectAnimator、AnimatorSet(动画集)。
ValueAnimator本身不作用于任何对象,但是它可以对一个值做动画,可以监听动画过程onAnimationUpdate,在动画中改变实际对象的属性值。
在XML定义,res/animator目录下
    
    
    
    
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:ordering=["together"|"sequentially"]>
  4. <objectAnimator
  5. android:duration="int"
  6. android:propertyName="string" //属性动画作用对象属性的名称
  7. android:repeatCount="int" //重复次数,-1表示无线循环
  8. android:repeatMode=["restart"|"reverse"] //动画重复模式
  9. android:startOffset="int" //动画开始后,延时多少毫秒才会真正播放次动画
  10. android:valueFrom="float|int|color" //属性起始值
  11. android:valueTo="float|int|color" //属性结束值
  12. android:valueType=["intType"|"floatType"] /> //属性的类型那个为整型还是浮点型
  13. <animator
  14. ...
  15. />
  16. </set>
     
     
     
     
  1. AnimatorSet set = (AnimatorSet)AnimatorInflater.loadAnimation(myContext,R.anim.property_animator);
  2. set.setTarget(mBtn);
  3. set.start();
最好是在代码中去实现,因为有些属性在xml里无法知道初始值。

对任意属性做动画:
对Object的属性abc做动画,如果想让动画生效需要条件:
1、Object必须提供setAbc方法,如果动画时候没有传递初始值,还要提供getAbc;
2、Object的setAbc对属性abc所改变必须能够通过改变反映出来;
如果条件2不满足,有三种解决方法。
1、给对象加上get和set方法,如果有权限的话;
2、用一个类包装原始对象,间接为其提供get和set方法;
    
    
    
    
  1. private void performAnimate(){
  2. ViewWrapper wrapper = new ViewWrapper(mBtn);
  3. ObjectAnimaton.ofInt(wrapper,"width",500).setDuration(5000).start();
  4. private static class ViewWrapper{
  5. private View mTarget;
  6. public ViewWrapper(View target){
  7. mTarget=target;
  8. }
  9. public int getWidth(){
  10. return mTarget.getLayoutParams.width;
  11. }
  12. public void setWidth(int width){
  13. mTarget.getLayoutParams().width=width;
  14. mTarget.requestLayout;
  15. }
  16. }

3、采用ValueAnimator,监听动画过程,自己实现属性的改变;













来自为知笔记(Wiz)


你可能感兴趣的:(第7章 Android动画深入浅析)