Android之动画详解


是时候对安卓动画这块做一个详细的总结了,学会了动画就可以做一些很炫的效果出来,这样的应用很得用户的喜欢。安卓中的动画目前总共可以分为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不符合你的效果也可以自定义interpolator
s


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下载


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值