android开发:动画-属性动画

对于属性动画(Animator),API在11以上的可以直接用属性动画,低版本需要借助第三方库nineoldandroids.

实现方式有2种,1种是通过xml布局中的<set>、<animator><objectanimator>。第2种是代码直接设置。

1xml动画布局:

<set xmlns:android="http://schemas.android.com/apk/res/android"  
    android:ordering="sequentially" >  
  
    <objectAnimator  
        android:duration="2000"  
        android:propertyName="translationX"  
        android:valueFrom="-500"  
        android:valueTo="0"  
        android:valueType="floatType" >  
    </objectAnimator>  
  
    <set android:ordering="together" >  
        <objectAnimator  
            android:duration="3000"  
            android:propertyName="rotation"  
            android:valueFrom="0"  
            android:valueTo="360"  
            android:valueType="floatType" >  
        </objectAnimator>  
  
        <set android:ordering="sequentially" >  
            <objectAnimator  
                android:duration="1500"  
                android:propertyName="alpha"  
                android:valueFrom="1"  
                android:valueTo="0"  
                android:valueType="floatType" >  
            </objectAnimator>  
            <objectAnimator  
                android:duration="1500"  
                android:propertyName="alpha"  
                android:valueFrom="0"  
                android:valueTo="1"  
                android:valueType="floatType" >  
            </objectAnimator>  
        </set>  
    </set>  
  
</set>  

调用方式:

Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  
animator.setTarget(view);  
animator.start();  

2代码直接设置

AnimatorSet set = new AnimatorSet();
        set.playTogether(
                ObjectAnimator.ofFloat(view, "rotationX", 0, 360),//中心X轴旋转
                ObjectAnimator.ofFloat(view, "rotationY", 0, 360),//中心Y轴旋转
                ObjectAnimator.ofFloat(view, "rotation", 0, 90),//中点旋转
                ObjectAnimator.ofFloat(view, "translationX", 0, 90),//右平移
                ObjectAnimator.ofFloat(view, "translationY", 0, 90), //下平移
                ObjectAnimator.ofFloat(view, "scaleX", 1, 1.5f, 1), //缩放X
                ObjectAnimator.ofFloat(view, "scaleY", 1, 1.5f, 1),//缩放Y
                ObjectAnimator.ofFloat(view, "alpha", 1, 0.25f, 1) //透明度
        );
        set.setDuration(5000).start();


不存在get/set的属性动画

官方文档有3种解决方法推荐:

1给对象加上get、set方法;
2用一个类包装原始对象,简介提供get、set方法;

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

对于第二种和第三种的解决案例如下: 

 //第二种
        ViewWrapper wrapper = new ViewWrapper(view) {
        };
        ObjectAnimator.ofInt(wrapper, "width", 200, 500).setDuration(3000).start();
        //第三种
        ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 100);//百分比
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            private IntEvaluator intEvaluator = new IntEvaluator();

            @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int value = (int) animation.getAnimatedValue();//当前进度
                float rate = animation.getAnimatedFraction();//获取比例
                view.getLayoutParams().width = intEvaluator.evaluate(rate, 200, 500);
                view.requestLayout();
            }
        });
        valueAnimator.setDuration(3000).start();
public static abstract class ViewWrapper {
        private View view;

        public ViewWrapper(View view) {
            this.view = view;
        }

        public int getWidth() {
            return view == null ? 0 : view.getLayoutParams().width;
        }

        public void setWidth(int width) {
            view.getLayoutParams().width = width;
            view.requestLayout();
        }
    }



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值