安卓动画分为:
1.逐帧动画:将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似于动画片的工作原理。
2.补间动画:则是可以对View进行一系列的动画操作,包括淡入淡出、缩放、平移、旋转四种。
3.属性动画:可以通过改变对象的属性来达到更炫的动画效果。
这里只谈属性动画。
在首先了解几个方法:
1、setInterpolator():设置动画插值
2、setDuration():设置动画执行时间
3、setRepeatCount():设置动画重复次数
4、setRepeatMode():设置动画重复模式
5、setStartDelay():设置动画延时操作
6、setTarget():设置动画的对象
7、setEvaluator():设置动画过度的评估者。
这几个方法主要是配置你的动画的例如:
ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0.3f, 1.0F);
animator.setDuration(2000);//动画时间
animator.setInterpolator(new BounceInterpolator());//动画插值
animator.setRepeatCount(-1);//设置动画重复次数
animator.setRepeatMode(ValueAnimator.RESTART);//动画重复模式
animator.setStartDelay(1000);//动画延时执行
animator.start();//启动动画
再来说说几个重要的类:
1、ValueAnimator
2、ObjectAnimator
3、PropertyValuesHolder
4、LayoutTransition
接下来先讲 PropertyValuesHolder
一、PropertyValuesHolder
这个类可以实现一个动画更改多个效果但有一个缺点:只能多个动画一起执行,还得结合ObjectAnimator.ofPropertyValuesHolder(Object target,
PropertyValuesHolder… values)一块使用
实现方法:
PropertyValuesHolder pvhX =PropertyValuesHolder.ofFloat("alpha", 1f,1.5f, 1.0f, 0.0f, 1.3f, 0.8f, 1.0f);
PropertyValuesHolderpvhY=PropertyValuesHolder.ofFloat("scaleX", 1f,1.5f, 1.0f, 0.0f, 1.3f, 0.8f, 1.0f);
PropertyValuesHolderpvhZ=PropertyValuesHolder.ofFloat("scaleY", 1f,1.5f, 1.0f, 0.0f, 1.3f, 0.8f, 1.0f);
ObjectAnimatoranim=ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY, pvhZ).setDuration(1000);
anim.start();
二、ObjectAnimator
这是一个比较常用的类,他继承自ValueAnimator,
有几个比较常用的方法:ofFloat(),ofInt(),ofObject(),ofArgb(),
理解一下这几个方法
ofFloat() :执行浮点之间的插值
ofInt():执行int之间的插值
ofArgb():执行ARGB之间的插值
ofArgb():跟据一定的规则对目标对象的某个具体属性进行改变
举个例子:
ObjectAnimator.ofFloat(view, "rotationY",0.0F,180.0F,0.0F, 360.0F).setDuration(5000).start();
解释一下”rotationY”这个参数:你所设置的view中只要是带set属性的都可以;例如:如果这个View有 setRotationY() 方法,,你就可以写“rotationY”
三、ValueAnimator
用法与ObjectAnimator非常的相似,,只不过去除了属性而已,
ValueAnimator animator = ValueAnimator.ofFloat(0, 100);
但当你只写这一句时你会发现并没有你行要的效果,可以对比一下ObjectAnimator,你会发现这里少了属性这个参数,,所以需要我们手动设置 如:
animator.setTarget(view);
animator.setDuration(1000).start();
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
view.setTranslationY((Float) valueAnimator.getAnimatedValue());
}
});
当然,还有些需求就是我要在动画执行时有些其他的动作,ValueAnimator提供了addListener接口:
anim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
}
@Override
public void onAnimationEnd(Animator animator) {
Intent intent=new Intent(MainActivity.this, ValueAnimatorActivity.class);
startActivity(intent); overridePendingTransition(R.anim.slide_out_right,R.anim.slide_in_left);
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
}
});
如果感觉这里代码太长,可以使用AnimatorListenerAdapter
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation); Intent intent = new Intent(ValueAnimatorActivity.this, LayoutAnimations.class);
startActivity(intent);
}
});