极客学院Animation教程讲解的很详细,点击进入哦
这里为学习的整理和补充O(∩_∩)O
一、 使用ValueAnimator
- 初始化ValueAnimator
- 方式一
//演示从(0,0)到(400,400)的移动
view = findViewById(R.id.view);
//可以传入n个Int类型的数值,这里仅传入两个0、400
ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 400);
valueAnimator.setDuration(3000);
//监听3000ms内,从0->400数值的实时变化
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int curValue = (int) animation.getAnimatedValue();
//没有layout的调用,view是不会移动的,layout设置view的位置
view.layout(curValue, curValue, curValue + view.getWidth(), curValue + view.getHeight());
}});
//开始动画
valueAnimator.start();
//也可以设置延长n毫秒之后启动
//valueAnimator.setStartDelay(10000);
- 方式二
//和ofInt的功能一样,只是一个Int类型,一个Float类型
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f,288.88f, 88.8f);
valueAnimator.setDuration(3000);
valueAnimator.setRepeatCount(1);
valueAnimator.setRepeatMode(ValueAnimator.INFINITE);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Float animatedValue = (Float) animation.getAnimatedValue();
//获取整数部分的值
int curValue = animatedValue.intValue();
view.layout(curValue, curValue, curValue + view.getWidth(), curValue + view.getHeight());
}});
valueAnimator.start();
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击取消当前动画
valueAnimator.cancel();
}});
注意:此时view的位置已经移动,点击此时的view是有反应的,这是和补间动画不同的,点击进入,后记中有标注
2.添加Listener 监听
valueAnimator.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) {
}
});
//执行结果 start->(repeat)->(cancel)->end
3.取消监听
//移除 AnimatorUpdateListener
void removeUpdateListener(AnimatorUpdateListener listener);
void removeAllUpdateListeners();
//移除 AnimatorListener
void removeListener(AnimatorListener listener);
void removeAllListeners();
4.其他函数
//完全克隆一个 ValueAnimator 实例,包括它所有的设置以及所有对监听器代码的处理
//和克隆差不多,两者除了外貌,并没有其他的关联哦~
public ValueAnimator clone()
二、小试牛刀
一起尝试一下下边的例子如何实现吧!
引用自http://wiki.jikexueyuan.com/project/android-animation/6.html
-
首先,可以看出这是一个在一定时间内变大的圆,并且最后回弹了,可以用BounceInterpolator
-
那么,第一步,我们定义一个圆,在res/drawable下新建circle.xml文件
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="30dp"
android:height="30dp"
/>
<solid
android:color="#ff0000"
/>
</shape>
就可以得到这样一个圆:
红红滴圆.png
- 在布局中引用一下
<View
android:gravity="center"
android:id="@+id/view"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@drawable/circle"
/>
- 最后一步,java代码引用,yeah~
view = findViewById(R.id.view);
ValueAnimator valueAnimator = ValueAnimator.ofInt(20, 600);
valueAnimator.setDuration(3000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int curValue = (int) animation.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
layoutParams.width = layoutParams.height = curValue;
view.setLayoutParams(layoutParams);
}});
valueAnimator.setInterpolator(new BounceInterpolator());
valueAnimator.start();
}
后记:
Property Animator(属性动画) 包括 ValueAnimator 和 ObjectAnimation,Property Animator 是通过改变控件内部的属性值来达到动画效果的;
View Animation(视图动画) 包括 Tween Animation(补间动画)和 Frame Animation(逐帧动画),补间动画虽能对控件做动画,但并没有改变控件内部的属性值;之前的TranslateAnimation就是补间动画
专业术语,还是稍微记一下吧😁
网友评论