属性动画

1:补间动画仅仅可以对view进行操作,对其他对象就不可以执行动画。

     补间动画不是真正的改变view的属性,当对view做移动动画时  其实本质上view的位置并没有发生变化。    


ValueAnimator详见:

//设置动画执行取值区间
valueAnimator= ValueAnimator.ofInt(0,2);
//设置插值器 fraction的计算实现
valueAnimator.setInterpolator(aci);
//动画执行时间
valueAnimator.setDuration(3000);
//设置动画重复执行的模式
valueAnimator.setRepeatMode();
//设置开始执行动画的延时时间
valueAnimator.setStartDelay(2000);

//设置重复次数
valueAnimator.setRepeatCount();
//立即在此时结束动画执行
valueAnimator.cancel();
//立即结束动画执行 并且立即执行动画到最后
valueAnimator.end();
//设置动画的估值器
valueAnimator.setEvaluator(new FloatEvaluator());

//添加动画执行过程的监听  自定义动画时根据这个值来设置动画执行的进度
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
//开始执行动画
valueAnimator.start();
//判断动画是否还在执行中
valueAnimator.isRunning()



Interpolator
插值器  自定义插值器:(就是根据数学中的曲线来个方程  计算每个阶段的值)    

class MyInterpolator implements TimeInterpolator {

    @Override
    public float getInterpolation(float input) {
        pos = -4 * input * input + 4 * input + 1;
        Log.d(TAG, "getInterpolation: pos==" + pos);
        return 0;
    }
}

注意:我们这个地方计算的结果就是 animation.getAnimatedFraction() 的结果

这个就是插值器的作用


估值器:TypeEvaluator  作用就是决定 animation.getAnimatedValue() 返回对象的类型

实例:

valueAnimator= ValueAnimator.ofObject(new MyEvaluator(),0,1);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            Position position= (Position) animation.getAnimatedValue();
        }
    });
}
class MyEvaluator implements TypeEvaluator{

    @Override
    public Object evaluate(float fraction, Object startValue, Object endValue) {

        return new Position(100*fraction,100*fraction);

    }

}



ObjectAnimator AnimatorSet

AnimatorSet set = new AnimatorSet();

ObjectAnimator animatorX = ObjectAnimator.ofFloat(v, "scaleX", scaleX);

属性动画的变幻类型:

translationY
backgroundColor
rotationX
rotationY
rotation
translationX
translationY
scaleX
scaleY
alpha

属性动画直接可以变换的要求是已经给这个对象设置了get set方法  否则不可以使用相关属性进行变换


如何我们向设置一个width属性变换一个view的宽度  但是没有这个属性对应的get  set方法

实现思路下面三个:
1:用一个类来包装原始对象,间接为其提供get和set方法

  
ObjectAnimator animator=ObjectAnimator.ofInt(new ViewWraper(but),"width",10,300);
animator.setDuration(3000);
animator.setInterpolator(new LinearInterpolator());
animator.start();
class ViewWraper{

    private View mTarget;

    public ViewWraper(View mTarget) {
        this.mTarget = mTarget;
    }

    public int getWidth(){
        return mTarget.getLayoutParams().width;
    }

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

}

2:通过ValueAnimator监听动画的进程实现手动更新view属性

ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 100);  
      
        valueAnimator.addUpdateListener(new AnimatorUpdateListener() {  
      
            //持有一个IntEvaluator对象,方便下面估值的时候使用  
            private IntEvaluator mEvaluator = new IntEvaluator();  
      
            @Override  
            public void onAnimationUpdate(ValueAnimator animator) {  
                //获得当前动画的进度值,整型,1-100之间  
                int currentValue = (Integer)animator.getAnimatedValue();  
                Log.d(TAG, "current value: " + currentValue);  
      
                //计算当前进度占整个动画过程的比例,浮点型,0-1之间  
                float fraction = currentValue / 100f;  
      
                //这里我偷懒了,不过有现成的干吗不用呢  
                //直接调用整型估值器通过比例计算出宽度,然后再设给Button  
                target.getLayoutParams().width = mEvaluator.evaluate(fraction, start, end);  
                target.requestLayout();  
            }  
        });  
      

        valueAnimator.setDuration(5000).start();



ObjectAnimator相关监听:

Animator.AnimatorListener() 监听动画开始结束  重复次数等等的监听器
 
ValueAnimator.AnimatorUpdateListener  监听动画执行进度的监听器

  结束一个view的属性动画不可以通过view实现关闭  必须通过属性动画本身关闭自己


注意点:

view上对动画的操作api都是对补间动画有作用:

but.clearAnimation(); but.getAnimation()

对属性动画没有任何效果。

各类效果展示

PROXY_PROPERTIES.put("alpha", PreHoneycombCompat.ALPHA);
PROXY_PROPERTIES.put("pivotX", PreHoneycombCompat.PIVOT_X);
PROXY_PROPERTIES.put("pivotY", PreHoneycombCompat.PIVOT_Y);
PROXY_PROPERTIES.put("translationX", PreHoneycombCompat.TRANSLATION_X);
PROXY_PROPERTIES.put("translationY", PreHoneycombCompat.TRANSLATION_Y);
PROXY_PROPERTIES.put("rotation", PreHoneycombCompat.ROTATION);
PROXY_PROPERTIES.put("rotationX", PreHoneycombCompat.ROTATION_X);
PROXY_PROPERTIES.put("rotationY", PreHoneycombCompat.ROTATION_Y);
PROXY_PROPERTIES.put("scaleX", PreHoneycombCompat.SCALE_X);
PROXY_PROPERTIES.put("scaleY", PreHoneycombCompat.SCALE_Y);
PROXY_PROPERTIES.put("scrollX", PreHoneycombCompat.SCROLL_X);
PROXY_PROPERTIES.put("scrollY", PreHoneycombCompat.SCROLL_Y);
PROXY_PROPERTIES.put("x", PreHoneycombCompat.X);
PROXY_PROPERTIES.put("y", PreHoneycombCompat.Y);

ViewHelper








额外点:
+//      设置动画放大的相对位置
        v.setPivotX(0);
        v.setPivotY(0);
































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值