Android: Property Animation 属性动画的使用



属性动画四种动画 :

           alpha                渐变

      scaleX             缩放  以x中心轴
      scaleY             缩放  以y中心轴

      translationX      位移  以x中心轴
      translationY      位移  以y中心轴
     
      rotation         旋转   通过 setPivotX(100);  setPivotY(100); 设置中心点
           rotationX       旋转   以x中心轴
           rotationY       旋转   以y中心轴

 Property Animation 是Android3.0(level 11)引入的一个款功能强大、灵活、健壮的动画系统,和补间动画很相似,不同的是补间动画不更改属性的值,只是实现了动画的效果,
但是属性动画是根据更改属性值来实现动画的效果.

ValueAnimator是Property Animation的核心类.

ValueAnimator的介绍:

          Animator.AnimatorListener  属性动画的事件监听
                      onAnimationStart (Animator  animation )   //动画开始触发
                     onAnimationRepeat(Animator  animation )  //动画循环播放触发
             onAnimationEnd(Animator  animation )      //动画结束触发
            onAnimationCancel(Animator  animation )   //动画取消触发  不管是什么情况下结束

    Animator.AnimatorUpdateListener               //当使用ValueAnimator进行动画实现的情况下  需要实现这个事件监听
          onAnimationUpadate (ValueAnimator  animation )     //动画每一帧都会调用这个方法   在这个方法中进行属性的更改
            getAnimatedValue()                             //通过这个方法可以获得当前的值  animation.getAnimaedValue()


创建一个动画    设置textview左间距从0到100改变的动画
 
    
ValueAnimator mAnimator = ValueAnimator.ofInt(0, 100); // 创建值动画
// 从0到100开始执行
mAnimator.addUpdateListener(new AnimatorUpdateListener() {
 
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int animatedValue = (int) animation.getAnimatedValue(); // 获得0到100的执行值
MarginLayoutParams layoutParamss = (MarginLayoutParams) textview
.getLayoutParams();
layoutParamss.leftMargin = animatedValue; //设置textview的外间距
textview.setLayoutParams(layoutParamss); //改变textveiw的属性值
}
});
mAnimator.setDuration(2000);
mAnimator.setRepeatCount(ValueAnimator.INFINITE);
mAnimator.setRepeatMode(ValueAnimator.REVERSE);
mAnimator.start();
 ValueAnimator值动画只是提供了值的改变,具体的属性值应该是多少  还需要自己去计算和设置
例如设置一个控件的大小改变
          
 
   
**
* 隐藏或显示ListView的动画
*/
public void hideOrShowListViewAnimator(final int startValue,final int endValue){
//1.设置属性的初始值和结束值
ValueAnimator mAnimator = ValueAnimator.ofInt(0,100);
//2.为目标对象的属性变化设置监听器
mAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// TODO Auto-generated method stub
int animatorValue = (int)animation.getAnimatedValue();
float fraction = animatorValue/100f;
IntEvaluator mEvaluator = new IntEvaluator();
//3.使用IntEvaluator计算属性值并赋值给ListView的高 IntEvaluator是把startValue减去endValue乘以百分比在加上startValue
mListView.getLayoutParams().height = mEvaluator.evaluate(fraction, startValue, endValue);
mListView.requestLayout();
}
});
//4.为ValueAnimator设置LinearInterpolator
mAnimator.setInterpolator(new LinearInterpolator());
//5.设置动画的持续时间
mAnimator.setDuration(500);
//6.为ValueAnimator设置目标对象并开始执行动画
mAnimator.setTarget(mListView);
mAnimator.start();
}

ObjectAnimator的介绍:

重要方法:
         view. setRotation();     //view的方法  以view的中心点 改变view的角度属性值
      view. setRotationX( );     //view的方法  以view的x的中心轴
      view. setScaleX();        //view的方法  进行x值的缩放
      view. setAlpha();         //view的方法  改变透明度的属性值
      view. setTranslationX();   //view的方法  改变x的位移属性值

ObjectAnimator是ValueAnimator的实现类,对ValueAnimator进行了封装,帮你实现了UpdateListener()的操作

    位移动画的实现:
          
 
   
ObjectAnimator animator1 = ObjectAnimator.ofFloat(textview,
"translationX", 0, 300);
animator1.setDuration(1000);                       //设置动画时间
animator1.setRepeatCount(111);                      //设置动画播放次数
animator1.setRepeatMode(ObjectAnimator.REVERSE); //设置动画模式
animator1.setInterpolator(new OvershootInterpolator());//设置插值器
animator1.start();
这种实现只是改变了X值的位移,如果改变Y值的位移把translationX改变为translationY
但是有个问题,如果我们要实现斜向移动应该怎么做呢    系统提供了一个 PropertyValuesHolder类来解决
 
   
// x和y坐标 斜向移动
PropertyValuesHolder ofFloat = PropertyValuesHolder.ofFloat(
"translationX", 0, 300);
PropertyValuesHolder ofFloat1 = PropertyValuesHolder.ofFloat(
"translationY", 0, 300);
ObjectAnimator objectAnimator = ObjectAnimator
.ofPropertyValuesHolder(textview, ofFloat, ofFloat1); //把x和y需要移动的值都添加到ObjectAnimator中
objectAnimator.setDuration(1000);
objectAnimator.setRepeatCount(ObjectAnimator.INFINITE);
objectAnimator.setRepeatMode(ObjectAnimator.REVERSE);
objectAnimator.start();  
旋转动画的实现:

以X中心轴进行旋转   从0度到90度再回去0度
 
    
ObjectAnimator animator1 = ObjectAnimator.ofFloat(textview,
"rotationX", 0.0f, 90.0f,0.0F);
textview.setPivotX(100);
textview.setPivotY(0);
animator1.setDuration(2000).start();
以Y为中心轴进行旋转  
 
    
ObjectAnimator animator2 = ObjectAnimator.ofFloat(textview,
"rotationY", 0.0f, 90.0f,0.0F);
textview.setPivotX(100);
textview.setPivotY(0);
animator2.setDuration(2000).start();
自己设置旋转中心轴
 
    
ObjectAnimator animator = ObjectAnimator.ofFloat(textview,
"rotation", 0.0f, 90.0f, 0.0F);
textview.setPivotX(100); //设置旋转中心的x值
textview.setPivotY(0); //设置旋转中心的y值
animator.setDuration(2000).start();
渐变动画的实现:
 
    
ObjectAnimator animator = ObjectAnimator.ofFloat(textview,
"alpha", 0f, 0.3f);
animator.start();
缩放动画的实现:
 
    
ObjectAnimator animator1 = ObjectAnimator.ofFloat(textview,
"scaleY", 1.0f, 0.0f);
animator1.setDuration(1000);
animator1.setRepeatCount(ObjectAnimator.INFINITE);
animator1.setRepeatMode(ObjectAnimator.REVERSE);


你可能感兴趣的:(android开发)