Android 3.0之前已有动画框架Animation(详见:Android之视图动画Animation),但存在一些局限性,当某个元素发生视图动画后,其响应事件位置还在动画前的地方。于是3.0之后,Google提出了属性动画。

ObjectAnimator

ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView, "translationX", 300);objectAnimator1.setInterpolator(new AccelerateInterpolator());objectAnimator1.setDuration(2000);objectAnimator.setRepeatCount(ValueAnimator.INFINITE);//Animation.INFINITE 表示重复多次objectAnimator.setRepeatMode(ValueAnimator.RESTART);//RESTART表示从头开始,REVERSE表示从末尾倒播objectAnimator1.start();

第一个参数:操纵的view
第二个参数:操纵的动画属性值
第三个参数:可变数组参数

动画属性值

translationX和translationY:增量控制view从它布局容器左上角坐标偏移

ObjectAnimator.ofFloat(imageView, "translationX", 300f);

rotation、rotationX、rotationY:控制view绕支点进行2D或3D旋转

ObjectAnimator.ofFloat(imageView, "rotation", 360);

scaleX、scaleY:控制view绕支点进行2D缩放

ObjectAnimator.ofFloat(imageView, "scaleX", 1f, 0.5f,1f);

alpha:控制view透明度,默认是1(不透明),0完全透明(不可见)

ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0.5f);

x和y:描述view在容器最终位置

可变数组参数

可以有一个到N个,如果是一个值的话默认这个值是动画过渡值的结束值。如果有N个值,动画就在这N个值之间过渡。

动画监听

ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView, "alpha", 0.5f, 1f);objectAnimator1.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) {    }});

一般我们只关心onAnimationEnd,所以Android提供了AnimatorListenerAdapter:

 ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView, "alpha", 0.5f, 1f); objectAnimator1.addListener(new AnimatorListenerAdapter() {     @Override     public void onAnimationEnd(Animator animation) {         super.onAnimationEnd(animation);     } });

ValueAnimator

ValueAnimator 本身不提供任何动画效果,像个数值 发生器,用来产生具有一点规律数字。

ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 100);valueAnimator.setTarget(imageView);valueAnimator.setDuration(2000).start();valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {    @Override    public void onAnimationUpdate(ValueAnimator animation) {        Int value = (Integer) animation.getAnimatedValue();        //TODO use the value        Toast.makeText(getApplicationContext(), "value=" + value, Toast.LENGTH_LONG).show();    }});

PropertyValuesHolder

针对同一个对象多个属性,同时作用多种动画

PropertyValuesHolder propertyValuesHolder1 = PropertyValuesHolder.ofFloat("translationX", 300f);PropertyValuesHolder propertyValuesHolder2 = PropertyValuesHolder.ofFloat("alpha", 1f, 0.5f);PropertyValuesHolder propertyValuesHolder3 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);PropertyValuesHolder propertyValuesHolder4 = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f);ObjectAnimator.ofPropertyValuesHolder(imageView, propertyValuesHolder1, propertyValuesHolder2, propertyValuesHolder3, propertyValuesHolder4)        .setDuration(5000).start();

AnimatorSet

与PropertyValuesHolder类似,但AnimatorSet多了playTogether(同时执行)、playSequentially(顺序执行)、play(objectAnimator1).with(objectAnimator2)、before、after这些方法协同工作。

ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0.5f);ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(imageView, "translationY", 300);ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(imageView, "scaleX", 1f, 0, 1f);AnimatorSet animatorSet = new AnimatorSet();animatorSet.setDuration(5000);animatorSet.playTogether(objectAnimator1, objectAnimator2,objectAnimator3);animatorSet.start();

xml使用属性动画

res下建立animator文件夹,然后建立res/animator/set_animator.xml

<?xml version="1.0" encoding="utf-8"?>

调用:

 Animator animator = AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.set_animator);animator.setTarget(imageView);animator.start();

动画组合
set标签,有一个orderring属性设置为together,还有另一个值:sequentially(表示一个接一个执行)。

<?xml version="1.0" encoding="utf-8"?>        

View的animate方法

Android 3.0后,谷歌给View增加animate方法直接驱动属性动画。

 imageView.animate() .alpha(0.5f) .y(300) .setDuration(2000) //api min is 16 .withStartAction(new Runnable() {     @Override     public void run() {     } }) //api min is 16 .withEndAction(new Runnable() {     @Override     public void run() {     } }) .start();

布局动画

设置子View过渡动画

<?xml version="1.0" encoding="utf-8"?>    
 LinearLayout parentLayout = (LinearLayout) findViewById(R.id.parentLayout); ScaleAnimation scaleAnimation=new ScaleAnimation(0,1,0,1); scaleAnimation.setDuration(2000); LayoutAnimationController layoutAnimationController=new LayoutAnimationController(scaleAnimation,0.5f); layoutAnimationController.setOrder(LayoutAnimationController.ORDER_NORMAL); parentLayout.setLayoutAnimation(layoutAnimationController);

关于作者

点击查看

微信公众号

我的微信公众号:吴小龙同学
不止于技术分享,不取悦别人,写给懂的人看~
欢迎微信扫一扫关注


更多相关文章

  1. 关于Unable to execute dex: Java heap space 解决办法
  2. android布局全屏显示,状态栏和导航栏透明设置
  3. android中的R中属性获取相关
  4. Android基础入门教程——8.1.2 Android中的13种Drawable
  5. Android(安卓)圆角图片CircleImageView
  6. android之intent的Flag详解
  7. Android(安卓)博文积累
  8. Android文档学习08_自定义view
  9. 分析(Android下的任务和Activity栈)

随机推荐

  1. Material Design之导航栏BottomNavigatio
  2. android查看input设备
  3. Android笔记---使用HttpClient发送POST和
  4. 【Android(安卓)studio】Gradle download
  5. 关于LayoutInflate和View-infalte的参数
  6. android 镜像文件打包和解压
  7. 入门: 在Windows上搭建Flutter开发环境
  8. Android的嵌入式关系型SQLite数据库使用
  9. Android如何 如何关闭 DM-verity
  10. Android(安卓)开发——浅谈onInterceptTo