Android 各类动画的使用方法

1 篇文章 0 订阅
1 篇文章 0 订阅
Android的动画有三类:

1,补间动画。2,帧动画。3,属性动画



这里的实现主要是做补间动画和属性动画的实现



补间动画:
补间动画有四种:
ScaleAnimation(大小缩放,X、Y轴缩放,还包括缩放中心pivotX、pivotY)
TranslationAnimation(位移,X、Y轴位移)

RotateAnimation(旋转,包括缩放中心pivotX、pivotY)

AlphaAnimation(透明度(alpha)渐变效果)


补间动画属性动画最大的区别就是:补间动画是不会改变view的属性,只是在视觉上进行动画效果。

举个例子:

一个button初始位置在(0,0),通过补间动画的TranslationAnimation领他移动到(5,5),在这整个过程中,这个button的有效点击区域都是(0,0),不会因为动画位置移动而发生改变。


补间动画的用法:
1,xml构建:
在anim目录下新建一个XML文件

<translate
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="0"
    android:toYDelta="100"
    android:repeatMode="reverse"
    android:repeatCount="-1"
    android:duration="1000">
    

</translate>
上面的代码设置了view的Y坐标从0移动到100,时间是1秒

其中有两个属性:

repeatCount:设置动画播放的次数,当值为-1时,永远执行

repeatMode:设置动画重复播放的模式

restart:普通的循环播放,一次动画部分完成后会直接回到初始位置开始播放(中间没有动画)

resverse:当动画播放的次数是偶数次或者永远循环播放时,会有反向效果(在一次动画播放完成后,会以动画的形式反向回到初始位置)


在设置好xml文件后再代码中:

		    Animation translateY = AnimationUtils.loadAnimation(this, R.anim.translate_y);
		    mBlueBall.startAnimation(translateY);

mBlueBall是一个imageView,任何一个View的之类都能使用这个方法。




2,代码构建补间动画:
		/*
		 * android.view.animation.TranslateAnimation.TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
		 * */
		 TranslateAnimation animation = new TranslateAnimation(0, 200, 0, 0);
		    animation.setDuration(1000);
		    animation.setFillAfter(true);
		    animation.setInterpolator(new AccelerateInterpolator());
		    mBlueBall.startAnimation(animation);

上面的代码设置了view的X坐标从0移动到200,时间是1秒

其中animation.setFillAfter(true);是设置动画播放完成后是否返回初始位置。

animation.setInterpolator(new AccelerateInterpolator());是设置动画播放速度的类型,主要有8种

LinearInterpolator(匀速)
AccelerateInterpolator(先慢后快)
AccelerateDecelerateInterpolator(先慢中快后慢)
DecelerateInterpolator(先快后慢)
CycleInterpolator(循环播放,速度为正弦曲线)
AnticipateInterpolator(先回撤,再匀速向前)
OvershootInterpolator(超过,拉回)
BounceInterpolator(回弹)


同样地,XML的属性也能在代码中设置,这就不一一举例。

主要详细记录是的属性动画的使用。

属性动画有4种使用创建方式:
1,ObjectAnimator

2,ValueAnimator

3.AnimatorInflater(XML定义创建)

4,View.animate();

ObjectAnimator:

ObjeckAnimator是这么多个方式中相对比较容易实现的

ObjectAnimator anim2 = ObjectAnimator
	 .ofFloat(view, "alpha", 1.0f, 0.75f, 0.5f, 0.25f, 0.15f, 0.0f)//
	 .setDuration(5000);
	 anim2.setInterpolator(new LinearInterpolator());
	 anim2.start();

这是定义View的透明值从不透明到完全透明的过程,过程是5秒,其中

ObjectAnimator android.animation.ObjectAnimator.ofFloat(Object view, String propertyName, float... values)

view:是需要动画的view实体

propertyName:动画需要变化的属性的名称,这个名称需要在view中有getter和setter才有效。

values:后面的数值数量是不确定的最少一个,当参数只有一个的时候,就认为动画变化属性的最终值是value,初始值是view.getter的值,当values的数量是两个时,就认为第一个是初始值,最后一个是最终值,如此类推。


anim2.setInterpolator(new LinearInterpolator());跟补间动画一样,是设置动画播放的速度方式。


ObjectAnimator还有一种用法:

ObjectAnimator anim = ObjectAnimator
				.ofFloat(view, "scaleDisplay", 1.0F,  0.2F)
				.setDuration(500);
		anim.start();
		
		anim.addUpdateListener(new AnimatorUpdateListener()
		{
			@Override
			public void onAnimationUpdate(ValueAnimator animation)
			{
				float value = (Float) animation.getAnimatedValue();
				view.setAlpha(value);
				view.setScaleX(value);
				view.setScaleY(value);
			}
		});

ofFloatpropertyName设置一个自定义的属性名,这样正常来说因为view中没有对应的getter,所以动画是无效的。但是当我们添加一个UpdateListener后。就可以在listener中做对应的属性变化。这样也可以做到同样的效果。

onAnimationUpdate函数是动画每一段时间(貌似是10毫秒)都会调用的,

在这里获取每一帧传入的变化值(ValueAnimator.getAnimatedValue()),用来设置对应的属性变化。

这样只要一个ObjectAnimator就可以做到AnimatorSet.playTogether()的效果,唯一一点的不同是,因为属性变化的值都是同一个,所以所有属性变化的速率都是一样的。如果需要不用速率变化多个属性,还是需要使用AnimatorSet


ValueAnimator的用法跟ObjectAnimator差不多,不同的是ValueAnimator在设置的时候不需要定义变化的属性,而是在中设置

ValueAnimator animator = ValueAnimator.ofFloat(0, 400);
		//稍微实现了一下,在不设置作用对象的情况下,一样可以对mBlueBall进行动画
		animator.setTarget(mBlueBall);
		animator.setDuration(1000).start();
		animator.addUpdateListener(new AnimatorUpdateListener()
		{
			@Override
			public void onAnimationUpdate(ValueAnimator animation)
			{
				mBlueBall.setTranslationY((Float) animation.getAnimatedValue());
			}
		});

然而,ValueAnimator还可以做一些相对复杂的动画,通过设置

void android.animation. ValueAnimator.setEvaluator( TypeEvaluator value)

TypeEvaluator值是一个泛型,可以根据自己的需求定义一个类型或者传入一个map类型。

ValueAnimator valueAnimator = new ValueAnimator();
		valueAnimator.setDuration(3000);
		
		valueAnimator.setObjectValues(new HashMap<String, Object>());
		valueAnimator.setInterpolator(new LinearInterpolator());
		valueAnimator.setEvaluator(new TypeEvaluator<Map<String, Object>>()
		{
			// fraction = t / duration
			@Override
			public Map evaluate(float fraction, Map startValue,
					Map endValue)
			{
				Map<String, Object> map = new HashMap<String, Object>();
				map.put("x", 200 * fraction * 3);
				map.put("y", 0.5f * 100 * (fraction * 3) * (fraction * 3));
				return map;
			}
		});
		
		
		valueAnimator.addUpdateListener(new AnimatorUpdateListener()
		{
			@Override
			public void onAnimationUpdate(ValueAnimator animation)
			{
				Map<String, Object> map = (Map<String, Object>) animation.getAnimatedValue();
				//float x = (Float) map.get("x");
				mBlueBall.setX((Float)map.get("x"));
				mBlueBall.setY((Float)map.get("y"));

			}
		});
		valueAnimator.start();

基本流程是在Evaluator中定义好泛型的值然后再updateListener中获取做对应的属性变化处理。


AnimatorInflater(XML定义创建):这个的用法和补间动画中的xml创建一样 

首先设置xml文件:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together" >

    <objectAnimator
        android:duration="1000"
        android:propertyName="scaleX"
        android:valueFrom="1"
        android:valueTo="0.5" >
    </objectAnimator>
    <objectAnimator
        android:duration="1000"
        android:propertyName="scaleY"
        android:valueFrom="1"
        android:valueTo="0.5" >
    </objectAnimator>

</set>

在set便签中的ordering属性:together同一时间播放动画,sequentially表示顺序执行

然后在代码中获取:

// 加载动画
		Animator anim = AnimatorInflater.loadAnimator(this, R.animator.scale);
		mMv.setPivotX(0);
		mMv.setPivotY(0);
		//显示的调用invalidate
		mMv.invalidate();
		anim.setTarget(mMv);
		anim.start();

这里因为手动设置了view的prvotX属性。所以要手动调用一下invalidate();






PS:参考博客:Android 属性动画(Property Animation) 完全解析 (上)

http://blog.csdn.net/lmj623565791/article/details/38067475




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值