1,补间动画。2,帧动画。3,属性动画
这里的实现主要是做补间动画和属性动画的实现
补间动画有四种:
ScaleAnimation(大小缩放,X、Y轴缩放,还包括缩放中心pivotX、pivotY)
TranslationAnimation(位移,X、Y轴位移)
RotateAnimation(旋转,包括缩放中心pivotX、pivotY)
AlphaAnimation(透明度(alpha)渐变效果)
举个例子:
一个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的之类都能使用这个方法。
/*
* 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(回弹)
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);
}
});
在ofFloat中propertyName设置一个自定义的属性名,这样正常来说因为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