android view 动画框架

原理:

绘制view时会调用viewGroup中的drawChild函数时,获取view的Animation的Transformation值,then调用canvas.concat(transformToApply.getMatrix),通过矩阵运算完成帧动画。

历史:

 视图动画:AlphaAnimation、RotateAnimation、TranslateAnimation、ScaleAnimation、AnimationSet(动画集合)
      开启方法:
           1.实例化AlphaAnimation(举例)
           2.配置属性(set方法,监听器)
           3.view.startAnimation(animation)
      属性动画(Android 3.0):
           较视图动画的优势:具备交互性。
           基础:AnimatorSet 和 ObjectAnimator
           ObjectAnimator使用了一个静态工厂方法创建实例。

ObjectAnimator animatior = ObjectAnimator.ofFloat(button, "translationY", 300 + i * 100); animatior.setDuration(300); LinearInterpolator ll = new LinearInterpolator(); animatior.setInterpolator(ll); animatior.start();

第一个参数是view(整个view必须要有set和get),第二个是要修改的属性【translationX和translationY、rotation和rotationX和rotationY、scaleX和ScaleY、pivotX和pivotY:支点坐标、alpha】,第三个是设置的值。

如果view中得属性没有使用set和get方法,还要使用属性动画,google提供了两个方法来解决这个问题:
1.自定义个属性类或包装类,来间接地给这个属性增加get、set方法。
2.使用ValueAnimatior
public class WrapperView { private View mTarget; public WrapperView(View target){ mTarget = target; } public int getWidth(){ return mTarget.getLayoutParams().width; } public void setWidth(int width){ mTarget.getLayoutParams().width = width; mTarget.requestLayout(); } }
使用时:
WrapperView wrapperView = new WrapperView(button); ObjectAnimator.ofInt(wrapperView,"width",50).setDuration(5000).start();

PropertyValuesHolder

作用:针对同一个对象的多个属性使用动画。
使用方法:
PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat("translationY",300 + i * 100); PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleX",1.5f); PropertyValuesHolder pvh3 = PropertyValuesHolder.ofFloat("alpha",0.1f); ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(button,pvh1,pvh2,pvh3); animator.setDuration(300);animator.start();

ValueAnimator

ObjectAnimator继承于ValueAnimator。
作用:本身并不具备动画的功能,而是一个数值发生器,用来产生具有一定规律的数字,进而控制动画的实现过程。

AnimatorSet

 既能实现propertyValuesHolder的功能,还能提供更为精确的顺序控制。
 提供play().with().before().after()、playTogether()、playSequentially()

在XML中使用属性动画

在res文件夹下建立animator文件夹,在新建文件scale.xml,内容如下:

<?xml version="1.0"encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"    
android:duration = "300"  
android:propertyName= "scaleX"  
android:valueFrom = "1.0"   
android:valueTo = "2.0"   
android:valueType = "floatType"    />

在类中以下面的方式调用:

 Animator animator = AnimatorInflater.loadAnimator(this,R.animator.scale);
 animator.setTarget(button);
 animator.start();

一种简便的属性动画书写方式:

android 3.0以后可以直接使用view.animate()使用属性动画。

 button.animate().alpha(0.1f).scaleX(2.0f).y(300).setDuration(300).withStartAction(
    new Runnable() {      
        @Override       
       public void run() {       
       }    
    }).withEndAction(new Runnable() { 
       @Override 
       public void run() {
       }        
}).start();
}});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Animation Animation类是所有动画(scale、alpha、translate、rotate)的基...
    四月一号阅读 5,901评论 0 10
  • 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今...
    未聞椛洺阅读 7,655评论 0 10
  • 最近在温习一下旧的姿势(知识),顺便熟练一下markdown,做个笔记。。 视图动画 透明度动画AlphaAnim...
    Guow110阅读 3,203评论 0 1
  • 上一章 书中的示例代码:github 本章主要介绍的是Android动画机制和使用技巧 1.Android视图动画...
    青藤绿阅读 5,550评论 3 32
  • 表格的学习目前重点学习下基本的: 这是表格 再就是注意下跨行,跨列的表格: 横跨两列的表格 姓名 电话 ...
    xlogcc阅读 2,669评论 0 0