Android Animation总结


一、动画分类

1. View Animation :
alpha 透明渐变 , Scale 缩放 、translate 位移, rotate 旋转
继承Animation,自己重写一个动画

2. Drawable Animation:
3. Property Animation : ViewAnimator,  ObjectAnimator
4. LayoutAnimationController 布局动画


1. View Animation (Tween动画) 
执行一系列简单的转换。
     针对 视图对象内容进行移动,放大,缩小以及产生透明度的变化等四种动画操作。仅针对视图对象内容:
     例如:有一个TextView仅能针对文字进行四种动画操作。
     例如:有一个ImageView仅能针对背景进行四种动画操作。

更多可参考文档:


2. Drawable Animation (Frame动画)
传统的动画方法,通过顺序的播放排列好的图片来实现。
某种意义上说像一个胶卷,它是创建一系列不同的对象,按顺序播放。基类是AnimationDrawable

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

更多可参考文档


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配置两种


参考资料:





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



三、移动动画源码

    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 内容修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值