动画:
分类:分为视图动画和属性动画,其中视图动画又分为补间动画和逐帧动画。补间动画又分为平移动画、缩放动画、旋转动画、透明度动画。
创建:利用xml文件来定义View动画的话,需要在工程的res目录下创建anim文件夹,把定义的动画都放到里面
视图动画
补间动画(xml实现、java实现未记录):
公共属性(这些属性是从Animation中继承下来的,在alpha、rotate、scale、translate标签中都可以直接使用。):
android:duration="3000" // 动画持续时间(ms),必须设置,动画才有效果
android:startOffset ="1000" // 动画延迟开始时间(ms)
android:fillBefore = “true” // 动画播放完后,视图是否会停留在动画开始的状态,默认为true
android:fillAfter = “false” // 动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false
android:fillEnabled= “true” // 是否应用fillBefore值,对fillAfter值无影响,默认为true
android:repeatMode= “restart” // 选择重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart|
android:repeatCount = “0” // 重放次数(所以动画的播放次数=重放次数+1),为infinite时无限重复
android:interpolator = @[package:]anim/interpolator_resource // 插值器,相当于变速器,改变不同阶段的执行速度
平移动画独有属性:
fromXDelta="0" //x初始位置 / toXDeleta="500" //x结束位置
fromYDeleta="0" / toYDeleta="500"
平移动画实例( R.anim.view_tran):
android:duration="3000"
android:startOffset ="1000"
android:fillBefore = "true"
android:fillAfter = "false"
android:fillEnabled= "true"
android:repeatMode= "restart"
android:repeatCount = "0"
android:fromXDelta="0"
android:toXDelta="-50"
android:fromYDelta="0"
android:toYDelta="-100%"
/>
缩放动画独有属性
fromXScale="0.0" X从0开始 / toXScale=“2” x放大到二倍
fromYScale / toYScale
缩放动画实例(R.anim.view_scal):
android:duration="3000"
android:startOffset ="1000"
android:fillBefore = "true"
android:fillAfter = "false"
android:fillEnabled= "true"
android:repeatMode= "restart"
android:repeatCount = "0"
android:fromXScale="0.5"
android:toXScale="2"
android:fromYScale="0.5"
android:toYScale="2"
android:pivotX="50%"
android:pivotY="50%"
/>
透明度独有属性:
fromAlpha="1.0" //动画开始是透明度
toAlpha="0.2" // 动画结束时透明度
透明度动画实例(R.anim.view_alph):
android:duration="3000"
android:startOffset ="1000"
android:fillBefore = "true"
android:fillAfter = "false"
android:fillEnabled= "true"
android:repeatMode= "restart"
android:repeatCount = "0"
android:fromAlpha="1.0"
android:toAlpha="0.2"
/>
旋转独有属性:
fromDegress="0" 旋转开始角度 //toDegress=“250” 旋转结束角度
pivotX旋转轴点X坐标 pivotY 旋转轴点Y坐标
旋转动画实例(R.anim.view_rota):
android:duration="3000"
android:startOffset ="1000"
android:fillBefore = "true"
android:fillAfter = "false"
android:fillEnabled= "true"
android:repeatMode= "restart"
android:repeatCount = "0"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%"
/>
rotate、scale动画的android:pivotX和android:pivotY属性、translate动画的android:toXDelta和android:toYDelta属性的取值都可以是都可以数值、百分数、百分数p,比如:50、50%、50%p,他们取值的代表的意义各不相同:
50表示以View左上角为原点沿坐标轴正方向(x轴向右,y轴向下)偏移50px的位置;
50%表示以View左上角为原点沿坐标轴正方向(x轴向右,y轴向下)偏移View宽度或高度的50%处的位置;
50%p表示以View左上角为原点沿坐标轴正方向(x轴向右,y轴向下)偏移父控件宽度或高度的50%处的位置(p表示相对于ParentView的位置)。
java代码中启动(以上四种补间动画的启动方式):
Animation translateAnimation = AnimationUtils.loadAnimation(this, R.anim.view_tran);
btTran.startAnimation(translateAnimation);
逐帧动画:
步骤: 1.将每一帧的图片放入drawable文件夹
2.设置xml文件,在java代码中启动
xml:
java代码中启动:
ImageView imgKnightAttack;
imgKnightAttack.setImageResource(R.drawable.knight_attack);
// 1. 设置动画
animationDrawable = (AnimationDrawable)imgKnightAttack.getDrawable();
// 2. 获取动画对象
animationDrawable .start()和animationDrawable .stop()
同时视图动画可以设置动画执行监听器:
animation.setAnimationListener(new Animation.AnimationListener() {
@Override public void onAnimationStart(Animation animation) {
// 动画开始
}
@Override public void onAnimationEnd(Animation animation) {
// 动画结束
}
@Override public void onAnimationRepeat(Animation animation) {
//动画重复
}
});
属性动画:
定义:控制属性来实现动画,和另外两个动画一样,既可以用xml来控制,也可以用java代码控制。启动也是java来控制
xml实现例子(view_attribute_animation):
通过android:propertyName来控制 是那种动画 和视图动画相同,分为四种,细分为以下几种 scaleY/scaleX;translationX/translationY;alpha;rotation;其他属性是在xml文件中有提示的。
组合动画 :
下面例子是 360度旋转着向x轴正方向位移200像素,然后再旋转着位移回原点,
然后执行第二段向反方向执行一次。
android:ordering="sequentially">
默认为 together :set中的动画同时执行
sequentially :set中的动画顺序执行
java代码中启动:
Animator animator = AnimatorInflater.loadAnimator(this, R.anim.view_attribute_animation);
animator.setTarget(imgAttribute);
animator.start();
java代码形式:
第一个参数是要绑定的组件 实例化的名字例如 ImageView imageView;第二个参数是要实现的动画名细分scaleY/scaleX;translationX/translationY;alpha;rotation;第三第四个,代表执行的动画效果,同时,可以加更多参数,代表该动画执行多次
ObjectAnimatoranimator=ObjectAnimator.ofFloat(imageView,"alpha",1f,0f);
animator.setDuration(1000);//时间1s
animator.start();
同时例如在旋转的时候,第三,第四个写的 如果前面的比后面的大,那么久代表逆时针(360f,0f 这表示逆时针旋转),移动同理,前面比后面大,代表负方向移动。
补间动画和属性动画的区别:
如果需求只是对View进行移动,缩放,旋转和淡入淡出的操作,补间动画就足够了,但是如果超出就没法了,而且补间动画最大的缺陷就是只改变了View的显示效果,而没有改变真正的显示效果,没有真正改变View的属性(例如在动画执行结束后,对组件执行点击事件,无反应)。