一、动画分类

1. View Animation :

alpha 透明渐变 , Scale 缩放 、translate 位移, rotate 旋转

继承Animation,自己重写一个动画

2. Drawable Animation:

3. Property Animation : ViewAnimator,  ObjectAnimator

4. LayoutAnimationController 布局动画

1. View Animation (Tween动画) 

执行一系列简单的转换。

     针对 视图对象内容进行移动,放大,缩小以及产生透明度的变化等四种动画操作。仅针对视图对象内容:

     例如:有一个TextView仅能针对文字进行四种动画操作。

     例如:有一个ImageView仅能针对背景进行四种动画操作。

更多可参考文档:

http://developer.android.com/guide/topics/graphics/view-animation.html

2. Drawable Animation (Frame动画)

传统的动画方法,通过顺序的播放排列好的图片来实现。

某种意义上说像一个胶卷,它是创建一系列不同的对象,按顺序播放。基类是AnimationDrawable

不能再onCreate中调用start方法,因为AnimationDrawable尚未完全附加到窗口上。如果你想立即播放动画,而无需互动,那么你可能想在您的活动onWindowFocusChanged()方法,当Android有焦点时调用它。

更多可参考文档

http://developer.android.com/guide/topics/graphics/drawable-animation.html

3.Property Animation

   Android 11 (3.0)以上才支持,看很多介绍时可以改变视图的属性,但是支持视图外所有对象的动画变换,但是未发现如何修改视图属性的。

ViewPropertyAnimator

interpolator

二、Property Animation与View Aimation区别?

1. View动画只支持4种属性,单独改变视图的宽高无法实现。

2. View动画仅修改绘制位置等,但是点击事件的位置不会变,导致点击错位。

3. View动画比属性动画代码量少,如果前者可以满足需求,不需要使用属性动画。

4. 属性动画可以直接修改View的属性值。

三、View Animation原理

1. 创建Animation

2. invalidate

3. drawChild、onDraw

4. getTransformation

两种模式:

独占:用主线程画,不能有其他操作

中断:每次都执行invalidate

四、Property Animation原理

View Animation 与 DrawableAnimation仅重新绘制,即使使用位移动画显示位置发生改变,其实视图的位置为发生改变。

分别是位置,大小,角度由Matrix 进行3*3的矩阵变换,、透明度Alpha负责。

代码和xml配置两种

参考资料:

Android中图像变换Matrix的原理、代码验证和应用(一) 共有3篇 分析android动画模块 Android 动画框架详解,第 1 部分 、  Android 动画框架详解,第 2 部分

Property Animation - 实解

Animation Resources

android动画(一)Interpolator

计算公式生成图像

http://www.wolframalpha.com/

关于android的animation的xml定义中的android:interpolator属性的含义

动画完整介绍 Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用

分析android动画模块 非常优秀

View Animation 例子:移动动画效果图

android animation详解 安卓animation_Android

三、移动动画源码

private ImageView mImageView;
	private TranslateAnimation mTranslateLeft;
	private TranslateAnimation mTranslateRight;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        
        // 供移动ImageView
        mImageView = (ImageView) findViewById(R.id.imageview);
        
        
        // 两个按钮
        Button leftButton = (Button) findViewById(R.id.left_button);
        leftButton.setOnClickListener(this);
        Button rightButton = (Button) findViewById(R.id.right_button);
        rightButton.setOnClickListener(this);
        
        // 指定移动位置
        mTranslateRight = new TranslateAnimation(0, 100, 0, 100);
		// 设置动画时间,单位是毫秒
		mTranslateRight.setDuration(1000);
		// 添加此开关,之后才有效
		mTranslateRight.setFillEnabled(true);  
		// 指动画结束时画面停留在此动画的第一帧
		mTranslateRight.setFillBefore(true); 
		
		mTranslateLeft = new TranslateAnimation(100, 0, 100, 0);
		mTranslateLeft.setDuration(1000);  
		mTranslateLeft.setFillEnabled(true);
		// 指动画结束时画面停留在此动画的最后一帧
		mTranslateLeft.setFillAfter(true); 
    }

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.left_button:
			// 启动方式1
			mImageView.setAnimation(mTranslateRight);
			mTranslateRight.startNow();
			break;

		case R.id.right_button:
			// 启动方式2
			mImageView.startAnimation(mTranslateLeft);
			break;
		}
	}

三、动画框架NineOldAnimation使用总结

1. 不需要判断Andorid API版本,直接使用nine old API

2. AndroidSet.setDuration无效,必须针对每一个Animator设置才有效

3. 关闭动画 - 不能使用View.clearAnimation() ,需要使用Animation.cancel();

4. 动画结束 - end监听中先cancel自己,可能会出现反复执行。动画执行结束后,如果使用监听,记得自己清理自己。AnimationSet 记得使用完后自己清理,并且恢复到初始状态。

5. 被动关闭 - 切换Activity会直接停止,所以停止时记得还原动画还原为初始状态。

6. 动画硬件加速:HTC G12 崩溃 (2.3系统)

2015-10-30 内容修改