首页 > 系统 > Android > 正文

Android属性动画(Animator)

2019-11-11 06:53:36
字体:
来源:转载
供稿:网友

传统的Animation动画虽然使用方便,但是不适合做具有交互性的动画效果,仅仅适合做展示性的动画,而Animator,属性动画,是改变了该view的内部属性,适合有交互功能的动画。

1.ObjectAnimator

代码:

//第一个参数,动画的对象,第二个参数,需要改变的动画属性,后边参数,变化的具体值(像素)//若写多个,则动画会同时实行,此例中即旋转360°的同时向x轴和y轴平移ObjectAnimator.ofFloat(iv, "rotation", 0f, 360f).setDuration(1000).start();ObjectAnimator.ofFloat(iv, "translationX", 0f, 200f).setDuration(1000).start();ObjectAnimator.ofFloat(iv, "translationY", 0f, 200f).setDuration(1000).start();

可用的属性有

属性名 含义
translationX和translationY x轴和y轴的偏移量
rotation、rotationX和rotationY 围绕支点旋转
scaleX和scaleY 缩放
pivotX和pivotY 控制着view对象的支点位置,围绕该支点旋转缩放处理,默认是view中心点
alpha 透明度

2.PRopertyValuesHolder

代码:

//效果同上,但动画效果做了优化,而且更有效率PropertyValuesHolder p1 = PropertyValuesHolder.ofFloat("rotation", 0f, 360f);PropertyValuesHolder p2 = PropertyValuesHolder.ofFloat("translationX", 0f, 200f);PropertyValuesHolder p3 = PropertyValuesHolder.ofFloat("translationY", 0f, 200f);//调用ofPropertyValuesHolder方法传入要动画的控件和PropertyValuesHolderObjectAnimator.ofPropertyValuesHolder(iv, p1, p2, p3).setDuration(1000).start();

3.AnimatorSet

提供了更多的动画控制效果

代码:

ObjectAnimator animator1 = ObjectAnimator.ofFloat(iv, "rotation", 0f, 360f);ObjectAnimator animator2 = ObjectAnimator.ofFloat(iv, "translationX", 0f, 200f);ObjectAnimator animator3 = ObjectAnimator.ofFloat(iv, "translationY", 0f, 200f);AnimatorSet set = new AnimatorSet();set.playTogether(animator1, animator2, animator3);//同时执行// set.playSequentially(animator1, animator2, animator3); //按顺序执行set.setDuration(1000);set.start();

还可以先x轴和y轴同时平移,最后才旋转

代码:

//将set.playTogether()替换为如下代码set.play(animator2).with(animator3);//with表示同时一起执行set.play(animator1).after(animator2);//after 2 或者 3 都可以

4.Animator监听事件

代码:

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "alpha", 0f, 1f);objectAnimator.setDuration(1000);//添加adapter来只监听某个事件或者如下注释的全部监听objectAnimator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); Toast.makeText(getapplicationContext(), "别点了!", Toast.LENGTH_LONG).show(); }});// objectAnimator.addListener(new Animator.AnimatorListener() {// @Override// public void onAnimationStart(Animator animation) {//// }//// @Override// public void onAnimationEnd(Animator animation) {// Toast.makeText(getApplicationContext(), "别点了!", Toast.LENGTH_LONG).show();// }//// @Override// public void onAnimationCancel(Animator animation) {//// }//// @Override// public void onAnimationRepeat(Animator animation) {//// }// });objectAnimator.start();

5.ValueAnimator的使用

ValueAnimator可以当做数值发生器,生产具有一定规律的数字,从而来控制动画的过程。

例如:

代码:按钮的点击事件中,设置ValueAnimator

ValueAnimator animator = ValueAnimator.ofInt(0, 100);animator.setDuration(5000);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { //获取动画过程中的value(上边定义的0~100),用以其他逻辑,例如设置文字 Integer value = (Integer) animation.getAnimatedValue(); bt.setText("" + value); }});animator.start();

6.View的animate方法

View直接就有animate()方法,用以直接驱动简单的属性动画

代码:

bt_time.animate() .alpha(0). setDuration(1000). withStartAction(new Runnable() { @Override public void run() { } }) .withEndAction(new Runnable() { @Override public void run() { } }) .start();
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表