Andriod 动画机制及使用~~~属性动画

属性动画Animator框架是在Android 3.0 之后,谷歌加入的.

在Animator框架中使用最多的就是AnimatorSet 和 ObjectAnimator 配合使用,ObjectAnimator 可以精细的控制一个对象的某一个属性,而可以使用多个 ObjectAnimator , 组合到 AnimatorSet 中形成组合动画。其中最重要的是:属性动画是通过调用属性的 get , set 方法来真实的控制View的属性值!

 1.ObjectAnimator

ObjeAnimator是属性动画中最重要的实行类,创建一个ObjectAnimator 只需要通它的静态工厂类直接返回一个 ObjectAnnimator

对象。

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mImageView, "translationX", 300);
        objectAnimator.setDuration(2000);
        objectAnimator.start();

它的参数包括要使用动画的对象,属性名称,注意这个属性名称一定要有 get , set 方法,因为属性动画是通过 Java 反射机制来通过 set 方法来修改属性值的。  大概的知识点 上面的例子也都包括了,其他的只要修改属性名称就行了。当然,属性动画也和视图动画一样可以设置,差值器,时长,等属性。

1.1 translationX , translationY : 这两个属性是里 控制 View 对象 从它布局容器的左上角坐标偏移位置。

1.2 rotation , rotationX ,rotationY : 控制View 对象围绕支点进行 2D ,3D 旋转。

1.3 scaleX , scaleY : 控制View对象 2D 的缩放。

1.4 pivotX , pivotY : 控制View 对象的支点位置,围绕支点进行旋转和缩放

1.5 x , y :它描述了View 对象在容器中的最终位置,它是最初的左上角的值 与 translationX,Y 的累计和

1.6 alpha : View 的透明度,默认为1,完全不透明, 0 完全透明。

这些属性都是可以直接用的,但是如果没有get , set 方法呢?这也是可以解决的。我们可以通过一个包装类,来给某一属性设置  get , set 方法。例如,View的width属性

 private static  class Wrapper{  // 此类必须为 静态 否则将找不到该属性
        private View mTagView;

        public Wrapper(View mTagView) {
            this.mTagView = mTagView;
        }
        public int getWidth(){
            return mTagView.getLayoutParams().width;
        }

        public void  setWidth(int width){
            mTagView.getLayoutParams().width = width;
            mTagView.getLayoutParams().height = width;
            mTagView.requestLayout();
        }
    }
这时就可以使用width属性了

  Wrapper wrapper =new Wrapper(mImageView);
        ObjectAnimator.ofInt(wrapper,"width",500).setDuration(2000).start();

2.ValueAnimator

ValueAnimator 在属性动画中占有非常重要的地位,因为它是核心所在,ObjectAnimator 就是继承它的。

ValueAnimator本身不具备任何动画效果,它更像一个数值发生器,用来产生具有一定规律的数值,从而让调用者来控制动画实现过程。


3.动画的监听

  objectAnimator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {  // 开始时调用
                
            }

            @Override
            public void onAnimationEnd(Animator animation) {  // 结束时 调用

            }

            @Override
            public void onAnimationCancel(Animator animation) { // 取消时调用

            }

            @Override
            public void onAnimationRepeat(Animator animation) { // 重复时调用

            }
        });
监听动画的状态,但是一般我们只要知道动画什么时候结束就行了,谷歌也提供了相应的方法

animator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
            }
        });
这样就只复写一个方法了。


4. AnimatorSet

对一个对象同时作用多个属性操作,可以控制播放顺序。有palyTogether() , playSequentially() , paly() , 

with() , before() , after() .


  ObjectAnimator translationXAnimator = ObjectAnimator.ofFloat(mImageView, "translationX", 300);

        ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mImageView, "alpha",0,1);
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(2000);
        animatorSet.playTogether(translationXAnimator,alphaAnimator);
        animatorSet.start();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值