动画的应用几乎随处可见,可见其重要性:下面是帧动画以及属性动画的一些简单介绍~
Frame动画:也叫帧动画,是通过一张张图片,切换形成的动画,例如电影。。。
// 初始化帧动画 ( 管理各个帧图像的类 )
animationDrawable = new AnimationDrawable();
// 添加帧(添加图像)
for (int i = 1; i < 11; i++) {
int resId = getResources().getIdentifier("pic"+i,"drawable",getApplication().getPackageName());
// 加载图像对象
Drawable d = getResources().getDrawable(resId);
animationDrawable.addFrame(d,200);
}
animationDrawable.setOneShot(false); // 是否只运行一次
iv.setImageDrawable(animationDrawable);
Frame动画可以使用AnimationDrawable来管理各个帧图像,然后控制他启动,停止
case R.id.btn_start:
animationDrawable.start();
break;
case R.id.btn_stop:
animationDrawable.stop();
break;
XML 中的配置,可以在 drawable 中创建 xml 文件,根节点为 animation-list ,如: my_frame_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/pic1" android:duration="200"/>
<item android:drawable="@drawable/pic2" android:duration="200"/>
<item android:drawable="@drawable/pic3" android:duration="200"/>
<item android:drawable="@drawable/pic4" android:duration="200"/>
<item android:drawable="@drawable/pic5" android:duration="200"/>
<item android:drawable="@drawable/pic6" android:duration="200"/>
<item android:drawable="@drawable/pic7" android:duration="200"/>
<item android:drawable="@drawable/pic8" android:duration="200"/>
<item android:drawable="@drawable/pic9" android:duration="200"/>
<item android:drawable="@drawable/pic10" android:duration="200"/>
</animation-list>
设置到图片视图上显示动画
<ImageView
android:id="@+id/iv2"
android:layout_width="200dp"
android:layout_height="200dp"
android:src="@drawable/my_frame_anim"/>
Animator 属性动画
通过不断的改变对象的某些属性(基于数值的变化改变某个属性值),不断的刷新形成的动画,常用的有 ObjectAnimator( 改变对象的属性 set get) 、ValueAnimator( 数值的变化 )
ObjectAnimator
操作的是一个对象的 get/set 方法对应的属性,不断的改变属性值,使其不断的变化产生的动画
class ViewWrapper {
View v;
public ViewWrapper(View v) {
this.v = v;
}
public void setWidth(int width) {
v.getLayoutParams().width = width;
v.requestLayout();
}
public int getWidth() {
return v.getLayoutParams().width;
}
}
对 ViewWrapper 使用属性动画
// 创建视图操作对象 ( 其中提供了 getWidth 和 setWidth 方法来改变或者获取其宽度值 )
ViewWrapper wrapper = new ViewWrapper(btnAnimator);
//ofInt 表示针对某个属性值进行整数的变化
// 改变的对象,改变属性名称,变化的数值
ObjectAnimator.ofInt(wrapper,"width",200,500)
.setDuration(2000) // 变化的时间
.start(); // 开始
常用属性操作
// 改变透明度
ObjectAnimator.ofFloat(iv3,View.ALPHA,1.0f,0.5f).setDuration(2000).start();
// 平移 TRANSLATION_X 水平平移 TRANSLATION_Y 垂直 TRANSLATION_Z 垂直手机屏幕移动
ObjectAnimator.ofFloat(iv3,View.TRANSLATION_X,0,100).setDuration(2000).start();
// 旋转 ROTATION_X 表示沿着 X 轴转 ROTATION_Y 沿着 Y 轴转 ROTATION 沿着 Z 轴转
ObjectAnimator.ofFloat(iv3,View.ROTATION_Y,0,60).setDuration(2000).start();
// 缩放 SCALE_X 缩放宽度 SCALE_Y 缩放高度
ObjectAnimator.ofFloat(iv3,View.SCALE_X,1,2.0f).setDuration(2000).start();
ValueAnimator
参考代码如下:
// 创建一个值变化的对象
ValueAnimator animator = ValueAnimator.ofFloat(1,100);
animator.setDuration(2000);
// 生成的值的特效
animator.setInterpolator(new BounceInterpolator());
// 监听变化
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 当前值
float value = (Float)animation.getAnimatedValue();
float rate = value/100;
ViewGroup.LayoutParams lp = iv3.getLayoutParams();
lp.width = (int) ((1+rate)*w);
lp.height = (int) ((1+rate)*h);
iv3.setLayoutParams(lp);
Log.e("m_tag",rate+"%"+" "+lp.width);
iv3.invalidate();
}
});
// 开始动画
animator.start();
可以配合计算因子一起去使用计算目标值
参考代码如下:
final IntEvaluator envaluator = new IntEvaluator();
// 创建一个值变化的对象
ValueAnimator animator = ValueAnimator.ofFloat(1,100);
animator.setDuration(2000);
// 生成的值的特效
animator.setInterpolator(new BounceInterpolator());
// 监听变化
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 当前值
float value = (Float)animation.getAnimatedValue();
float rate = value/100;
ViewGroup.LayoutParams lp = iv3.getLayoutParams();
lp.width = envaluator.evaluate(rate,300,500);
lp.height = envaluator.evaluate(rate,300,500);
iv3.setLayoutParams(lp);
Log.e("m_tag",rate+"%"+" "+lp.width);
iv3.invalidate();
}
});
// 开始动画
animator.start();
Evaluator
可以基于产生的值的百分比结合起始值和终止值之间计算出最终目标值
IntEvaluator 计算整数
FloatEvaluator 计算小数值
ArgbEvaluator 计算颜色值
TypeEvaluator 可以实现任何类型的计算
public class IntEvaluator implements TypeEvaluator<Integer> {
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
int startInt = startValue;
return (int)(startInt + fraction * (endValue - startInt));
}
}
好了,动画差不多就这些了!
我很喜欢一句话:种一棵树的最佳时机是十年前,其次是现在~
希望可以与各位共同进步