Animation动画(二)PropertyAnimation属性动画

视图动画和属性动画区别

  • 引入时间不同:View Animation是API Level 1就引入的。Property Animation是API Level 11引入的,即Android 3.0才开始有Property Animation相关的API。
  • 所在包名不同:View Animation在包android.view.animation中。而Property Animation API在包 android.animation中。
  • 动画类的命名不同:View Animation中动画类取名都叫XXXXAnimation,而在Property Animator中动画类的取名则叫XXXXAnimator
  • 视图动画只是改变控件的状态并没有改变控件的属性,二属性动画直接改变控件的属性

补间动画举例来康康效果:
在这里插入图片描述

从图中可以看出:

  • 点击移动到的位置根本不起作用,这也证实了,他只是改变动画的’肉体’,控件的’灵魂’还在原来的地方

属性动画效果;
在这里插入图片描述

大家可以很直观的看到,最后控件移动到什么位置,他就在什么位置,不会出现在原来位置才出现点击事件的效果.

属性动画ValueAnimator.onInt使用

有参数构造
ValueAnimator.ofInt(int… values)

					//设置移动的位置
ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 400,200,600);
valueAnimator.setDuration(2000);
//通过addUpdateListener来监听ofInt的变化 
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        int animatedValue = (int) animation.getAnimatedValue();
	Log.i("szjanimatedValue",animatedValue+"");
	//将值设置给TextView对象
       	tv.layout(animatedValue,animatedValue,tv.getWidth()+animatedValue,tv.getHeight()+animatedValue);
    }
});
valueAnimator.start();

大家可以看到,弹出的Log就是先从0 ->400->200->600
在这里插入图片描述

属性动画ValueAnimator.onFloat使用

有参构造:

ValueAnimator.ofFloat(float… values)

这里和ofInt使用基本类似,只是传的参数不同,onInt是int类型,onFloat是float类型,

ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 400f,200f,600f,405.2f,202.1f,600f);
valueAnimator.setDuration(2000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        //因为这里咋们使用的是ofFloat所以得强制转换成Float
        Float animated = (Float) animation.getAnimatedValue();
        Log.i("szjanimatedValue",animated+"");
        int animatedValue = animated.intValue();//转换为int类型设置给tv
        tv.layout(animatedValue,animatedValue,tv.getWidth()+animatedValue,tv.getHeight()+animatedValue);
    }
});
valueAnimator.start();

来康康onFloat的效果吧:

在这里插入图片描述

onInt和onFloat总结:

常用方法:

 设置动画时长,单位是毫秒 
ValueAnimator setDuration(long duration)

 获取ValueAnimator在运动时,当前运动点的值
 Object getAnimatedValue();
 
 开始动画
 void start()

设置循环次数,设置为INFINITE表示无限循环
void setRepeatCount(int value)

* 设置循环模式 
*  value取值有RESTART,REVERSE
void setRepeatMode(int value)

 取消动画 
void cancel()

setRepeatCount()和setRepeatMode()使用
在这里插入图片描述
这里我设置的是:
valueAnimator.setRepeatCount(3);//执行三次
valueAnimator.setRepeatMode(ValueAnimator.REVERSE);//反转

监听方法

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        //获取ValueAnimator在运动时,当前运动点的值
        Object animated =animation.getAnimatedValue();
     });

animation.getAnimatedValue();//获取ValueAnimator在运动时,当前运动点的值

valueAnimator.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {
        //最开始执行
        Log.i("szjjListener:","start");
    }
    @Override
    public void onAnimationEnd(Animator animation) {
        //执行完之后在执行
        Log.i("szjjListener","End");
    }
    @Override
    public void onAnimationCancel(Animator animation) {
        Log.i("szjjListener","Cancel");
    }

    @Override
    public void onAnimationRepeat(Animator animation) {
        //没执行一次执行 在start后执行
        Log.i("szjjListener","Repeat");
    }
});

因为valueAnimator.setRepeatCount(3);//执行三次
所以这里onAnimationRepeat()执行了3次
在这里插入图片描述

取消监听

/** * 移除AnimatorUpdateListener */
void removeUpdateListener(AnimatorUpdateListener listener);
void removeAllUpdateListeners(); 

/**  * 移除AnimatorListener  */
void removeListener(AnimatorListener listener);
void removeAllListeners();

valueAnimator.removeAllListeners();

效果:
在这里插入图片描述

来看看Log把:
在这里插入图片描述

通过Log可以看出,只要设置了valueAnimator.removeAllListeners();就会立即停止,不会接着往下执行正常情况下会是0f–>400–>200f–>600f–>405.2f–>202.1f–>600f

克隆与延时操作


 延时多久时间开始,单位是毫秒
public void setStartDelay(long startDelay)

完全克隆一个ValueAnimator实例,包括它所有的设置以及所有对监听器代码的处理 
public ValueAnimator clone()

使用:

注意:得先有valueAnimator控件才能克隆,否则的话会null

ValueAnimator clone = valueAnimator.clone();//克隆
clone.setStartDelay(2000);//设置2s后执行
clone.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        //因为这里咋们使用的是ofFloat所以得强制转换成Float
        Float animated = (Float) animation.getAnimatedValue();
        Log.i("szjanimatedValue",animated+"");
        int animatedValue = animated.intValue();//转换为int类型设置给tv
        tv.layout(animatedValue,animatedValue,tv.getWidth()+animatedValue,tv.getHeight()+animatedValue);
    }
});
clone.start();

来康康效果吧:

先获取原控件,然后在点击克隆
在这里插入图片描述

感谢大家的观看,有不同观点请在评论区留言~

Git地址链接: langyangyang.

参考代码: 启舰.

猜你喜欢

转载自blog.csdn.net/weixin_44819566/article/details/106896042
今日推荐