第7章 Android动画深入浅析

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


View动画
四种效果,平移(TranslateAnimation)、缩放(ScaleAnimation)、旋转(RotateAnimation)、透明度(AlphaAnimation)。
都可以采用Java和XML,XML可读性更好。
<?xml version="1.0" encoding="utf-8"?>
<setxmlns:android="http://schemes.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" //缩放的轴点x坐标,会影响缩放效果
    android:prvotY="float"/> //缩放的轴点y坐标,会影响缩放效果
  <translate
    android:fromXDelta="float" //x起始值
    android:toXDelata="float" //x结束值
    android:fromYDealta="float" //y的起始值
    android:toYDelata="float"/> //y的结束值
  <rotate
    android:fromDegrees="float" //旋转开始的角度
    android:toDegrees="float" //旋转结束的角度
    android:pivotX="float" //旋转的轴点x坐标
    android:prvotY="float"/> //旋转的轴点的y坐标
</set>
另外还有常用属性
android:duration——持续时间
android:fillAfter——动画结束之后View是否停留在结束位置
使用XML的动画:
Animation anim =AnimationUtils.loadAnimation(this,R.anim,animation);
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>。
Button mBtn =(Button)findViewById(R.id.btn);
mBtn.setBackgroundResource(R.drawable.fram_animation);
AnimationDrawable drawable =(AnimationDrawable)mBtn.getBackground();
drawable.start();
属性动画
Nineoldandroids兼容。常见的动画类:ValueAnimator、ObjectAnimator、AnimatorSet(动画集)。
ValueAnimator本身不作用于任何对象,但是它可以对一个值做动画,可以监听动画过程onAnimationUpdate,在动画中改变实际对象的属性值。
在XML定义,res/animator目录下
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:ordering=["together"|"sequentially"]>
   <objectAnimator
    android:duration="int"
    android:propertyName="string" //属性动画作用对象属性的名称
    android:repeatCount="int" //重复次数,-1表示无线循环
    android:repeatMode=["restart"|"reverse"] //动画重复模式
    android:startOffset="int" //动画开始后,延时多少毫秒才会真正播放次动画
    android:valueFrom="float|int|color" //属性起始值
    android:valueTo="float|int|color" //属性结束值
    android:valueType=["intType"|"floatType"] /> //属性的类型那个为整型还是浮点型
   <animator
     ...
   />
</set>
AnimatorSet set =(AnimatorSet)AnimatorInflater.loadAnimation(myContext,R.anim.property_animator);
set.setTarget(mBtn);
set.start();
最好是在代码中去实现,因为有些属性在xml里无法知道初始值。
 
对任意属性做动画:
对Object的属性abc做动画,如果想让动画生效需要条件:
1、Object必须提供setAbc方法,如果动画时候没有传递初始值,还要提供getAbc;
2、Object的setAbc对属性abc所改变必须能够通过改变反映出来;
如果条件2不满足,有三种解决方法。
1、给对象加上get和set方法,如果有权限的话;
2、用一个类包装原始对象,间接为其提供get和set方法;
privatevoid performAnimate(){
  ViewWrapper wrapper =newViewWrapper(mBtn);
  ObjectAnimaton.ofInt(wrapper,"width",500).setDuration(5000).start();
  privatestaticclassViewWrapper{
  privateView mTarget;
  publicViewWrapper(View target){
    mTarget=target;
  }
  publicint getWidth(){
    return mTarget.getLayoutParams.width;
  }
  publicvoid setWidth(int width){
    mTarget.getLayoutParams().width=width;
    mTarget.requestLayout;
  }
}

 

3、采用ValueAnimator,监听动画过程,自己实现属性的改变;
 
 
 
posted @ 2016-02-20 17:49  咖啡馆的水果拼盘  阅读(125)  评论(0)    收藏  举报