您的位置:首页 > 移动开发 > Android开发

Android之动画详解

2015-11-04 17:40 691 查看
是时候对安卓动画这块做一个详细的总结了,学会了动画就可以做一些很炫的效果出来,这样的应用很得用户的喜欢。安卓中的动画目前总共可以分为3类:补间动画、帧动画、属性动画。其中第三种是3.0后才出现的,与其他两种不同的是,这种动画改变的属性是View本身的属性。动画可以用代码来写,也可以用XML文件的形式来写,下面就按照3大类2中方式的形式分别做一个演示。

提供一个获取view中心点的方法:

// 获取view的中心点
	private static int[] getPivot(View view) {
		int[] viewleft = new int[2];
		view.getLocationInWindow(viewleft);
		int width = view.getWidth();
		int height = view.getHeight();
		int[] viewpivot = new int[2];
		viewpivot[0] = viewleft[0] + width / 2;
		viewpivot[1] = viewleft[1] + height / 2;
		Log.e("", "view在屏幕中的XY坐标:" + viewleft[0] + "," + viewleft[1] + "中心点的位置:" + viewpivot[0] + "," + viewpivot[1]);
		return viewpivot;
	}


下面进入今天的主题~~~~~~~~~~

一、补间动画

补间动画的效果有:旋转、缩放、改变透明度、平移

1.1旋转 代码演示:



// 旋转
<span style="white-space:pre">	</span>public static RotateAnimation rotate(View view) {
<span style="white-space:pre">		</span>// 建一个对象,围绕自身中心旋转
<span style="white-space:pre">		</span>RotateAnimation ra = new RotateAnimation(0, 359, RotateAnimation.RELATIVE_TO_SELF, (float) 0.5,
<span style="white-space:pre">				</span>RotateAnimation.RELATIVE_TO_SELF, (float) 0.5);
<span style="white-space:pre">		</span>ra.reset();
<span style="white-space:pre">		</span>ra.setDuration(1000 * 5);
<span style="white-space:pre">		</span>// 重复模式
<span style="white-space:pre">		</span>ra.setRepeatMode(RotateAnimation.RESTART);
<span style="white-space:pre">		</span>ra.setInterpolator(new AnticipateInterpolator());
<span style="white-space:pre">		</span>ra.setRepeatCount(3);
<span style="white-space:pre">		</span>return ra;
<span style="white-space:pre">	</span>}


Interpolator有以下值:

AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速

AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速

AnticipateInterpolator 开始的时候向后然后向前甩

AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值

BounceInterpolator 动画结束的时候弹起

CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线

DecelerateInterpolator 在动画开始的地方快然后慢

LinearInterpolator 以常量速率改变

OvershootInterpolator 向前甩一定值后再回到原来位置

如果android定义的interpolators不符合你的效果也可以自定义interpolators

1.2旋转 XML演示:

创建文件:res/anim/rotate.xml,文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromDegrees="0"
    android:interpolator="@android:anim/accelerate_interpolator"

    android:pivotX="50"
    android:pivotY="50"
    android:toDegrees="360" >

</rotate>


java代码如下:

am = AnimationUtils.loadAnimation(this, R.anim.rotate);
		ib.setAnimation(am);


2.1Alpha 代码演示:

// 渐变
	public static AlphaAnimation setAlpha() {
		AlphaAnimation aa = new AlphaAnimation(1, 0);
		aa.setDuration(5 * 1000);
		aa.setZAdjustment(10);
		return aa;
	}
2.2Alpha XML演示:

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromAlpha="1"
    android:interpolator="@android:anim/bounce_interpolator"
    android:toAlpha="0" >

</alpha>


3.1translation 代码演示:
注意:以view的左上角为原点

// translation
	public static TranslateAnimation setTransfor() {
		TranslateAnimation ta = new TranslateAnimation(-100, 100, -100, 100);
		ta.setDuration(5 * 1000);
		ta.setRepeatCount(2);
		return ta;
	}


3.2translation XML演示:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromXDelta="-100"
    android:fromYDelta="-100"
    android:toXDelta="200"
    android:toYDelta="200" >

</translate>


4.1缩放 代码演示:

<span style="font-size:10px;">	// 缩放
	public static ScaleAnimation setScale() {
		ScaleAnimation sa = new ScaleAnimation(0, 5, 0, 5, ScaleAnimation.RELATIVE_TO_SELF, 0.5f,
				ScaleAnimation.RELATIVE_TO_SELF, 0.5f);
		sa.setDuration(5000);
		sa.setRepeatCount(5);
		return sa;
	}</span>


4.2缩放 XML演示:

<span style="font-size:10px;"><?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromXScale="0"
    android:fromYScale="0"
    android:toXScale="5"
    android:toYScale="5" >

</scale></span>


结合显示:


// 集合
	public static AnimationSet setList() {
		AnimationSet as = new AnimationSet(false);
		as.setDuration(5000);
		as.addAnimation(setAlpha());
		as.addAnimation(setRotate());
		as.addAnimation(setScale());
		as.addAnimation(setTransfor());
		return as;
	}


二、帧动画

在res/animator或者res/drawable下面建一个XML文件,内容是类似下面的形式:

<span style="font-size:12px;"><animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false" >

    <item
        android:drawable="@drawable/sheep"
        android:duration="1000"/>
    <item
        android:drawable="@drawable/ic_launcher"
        android:duration="1000"/>
    <item
        android:drawable="@drawable/sheep"
        android:duration="1000"/>

</animation-list></span>


然后在调用处:

ib.setBackgroundResource(R.animator.list);
ad = (AnimationDrawable) ib.getBackground();		
ad.start();


就可以了。

三、属性动画

先来看看和这个动画相关的类:

ObjectAnimator 动画的执行类,后面详细介绍
ValueAnimator 动画的执行类,后面详细介绍
AnimatorSet 用于控制一组动画的执行:线性,一起,每个动画的先后执行等。

AnimatorInflater 用户加载属性动画的xml文件

TypeEvaluator 类型估值,主要用于设置动画操作属性的值。

TimeInterpolator 时间插值,就是在动画开始或者结束的时候增加一些额外的效果

该动画可以用XML文件写,也可以用代码写

属性动画和补间动画最大的区别就是属性动画改变的是View本身的属性,比如是让一个View移动,那么它是不断的改变View的坐标,然后重新绘制View,我们看到的动画其实都是view 绘制后的截图。其原理就是通过动画执行类,更加对其设置的数据对View进行操作,具体的动画执行类有ObjectAnimator、ValueAnimator,还有一个动画集合类AnimatorSet,其实ObjectAnimator就是继承于ValueAnimator,他们的使用方法其实就是ValueAnimator多了一步就是必须要添加一个监听接口:ValueAnimator.addUpdateListener(),下面对其使用做一个简要的说明,补间动画能设置的效果属性动画就能设置,他们其实功能是一样的。

改变X值:



<span style="font-size:14px;">	// 设置动画的属性
		ValueAnimator va = ValueAnimator.ofFloat(360).setDuration(1000);
		va.setRepeatCount(5);
		// 动画改变监听
		va.addUpdateListener(new AnimatorUpdateListener() {
			@Override
			public void onAnimationUpdate(ValueAnimator animation) {
				// 取到根据上面设置的属性算出对应的值,然后更新的接口里面得到对应的值用来对
				// View不同的属性设置该值,得到想要的效果
				iv.setRotationX((Float) animation.getAnimatedValue());
			}
		});
		// 监听动画的开始介绍等,我只重写了一个方法,如要监听别的,请自己重写对应的方法
		va.addListener(new AnimatorListenerAdapter() {
			@Override
			public void onAnimationEnd(Animator animation) {
				super.onAnimationEnd(animation);
				Log.e("", "动画结束啦!");
			}
		});
		// 该方法必须调用,否则没有效果
		va.start();</span>


用XML文件实现同样的效果:

<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:propertyName="rotationX"
    android:repeatCount="5"
    android:valueTo="360" >

</objectAnimator></span>


ok,动画的知识大概就是这么多,具体的细节就没写那么明白了。有了整体的认识,就知道怎么去学习了,学完了之后也懂得自己都学了点啥,这就是我写这边文章的目的,限于目前的水平,可能写的不是很好,我会努力的~~~~~

附上我练习的源码:Demo下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: