动画分三种,view动画,帧动画,属性动画,(帧动画也是view动画的一种)。
view动画:通过对view进行不断的图像变换(平移,缩放,旋转,透明度)从而产生动画
帧动画:通过顺序播放一系列图像产生动画效果。
属性动画:通过动态改变对象的属性达到动画效果。
view 动画 (平移,缩放,旋转, 透明度)
view四种动画对应着Animation的四个子类,TranslateAnimation ScaleAnimation RotateAnimation AlphaAnimation
四种动画可以通过xml定义也可用Java代码定义,推荐使用xml。
xml定义的动画既可以是单个的也可以是多个组合的。
1:xml定义view动画。
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="0.1" 开始时透明度
android:toAlpha="1" 结束时透明度
android:duration="5000" 动画持续时间。
></alpha>
<scale
android:fromXScale="0.0" 动画开始前x的缩放比例,
android:toXScale="1" 动画结束x的缩放比例
android:fromYScale="0.0"
android:toYScale="1"
android:pivotX="50%" 动画起始位置相对于屏幕的百分比,50%表示中间
android:pivotY="50%"
android:duration="5000" ></scale>
<rotate
android:fromDegrees="0" 动画开始的角度
android:toDegrees="-360" 动画结束时物件的旋转角度,正代表顺时针
android:pivotX="50%" 属性为动画相对于物件的X的坐标的开始位置
android:pivotY="50%" 属性为动画相对于物件的Y坐标的开始位置
android:startOffset="5000" 动画延迟多少时间开始执行。
android:duration="5000"></rotate>
<translate
android:fromXDelta="0" 起始时X的坐标
android:toXDelta="300" 结束时X的坐标
android:fromYDelta="0"
android:toYDelta="400"
android:startOffset="10000"
android:duration="5000" />
</set>
2: 动画添加到view上使用。
Button button = findViewById(R.id.button);
Animation animation = AnimationUtils.loadAnimation(this, R.anim.animation_button);
button.startAnimation(animation);
3:为动画添加监听
setAnimationListener 有开始 结束 重复动画、
4:动画的共同属性
Duration ; 动画的持续时间(毫秒)
fillAfter:设置为TRUE,动画转化在动画结束后被应用。
fillBefore:设置为TRUE,动画转化在动画开始前被应用。
interpolator:动画插入器(加速、减速插入器)
repeatCount:动画重复次数
repateMode :顺序重复/倒叙重复
startOffset : 动画之间的时间间隔。
view自定义动画:难点在于矩阵的运算 这里不做详细描述。
1:继承Animation抽象类,重写initialize和ApplyTransFormation
initialize用于初始化工作, applyTransFormation用于矩阵运算,
逐帧动画:
这个动画属于drawable资源,应该用xml在drawable中定义,
1:利用XML文件
AnimationDrawable drawable = (AnimationDrawable) getResources().getDrawable(R.drawable.animation_list);
imageView.setBackgroundDrawable(drawable);
drawable.start();
2:全部利用Java代码
AnimationDrawable frameAnim = new AnimationDrawable();
frameAnim.addFrame(getResources().getDrawable(R.drawable.img0), 50);
frameAnim.addFrame(getResources().getDrawable(R.drawable.img1), 50);
frameAnim.setOneShot(false);
imageView.setBackgroundDrawable(frameAnim);
frameAnim.start();
注:注意动画参数的数值
animation.setFillAfter(True); 设置完后view将不再能隐藏,保持再最后的位置及状态。
下面给大家介绍一种方法,
refuseround.clearAnimation();
refuseround.invalidate();
用上面两条语句来解决, 我以前以为用clearAnimation就可以了, 但是不然
如果你不用invalidate()来刷 新view的话, 你的界面会停留在放大后的界面
动画的特殊使用场景 viewGroup 和 Activity
viewGroup:可控制子元素的出场效果。 LayoutAnimation:常用在listview上,控制item
1:定义xml文件
anim_layout.xml
<layoutAnimation
android:delay = "0.5" <!--子元素开始动画的时间延迟,-->
android:animationOrder = "normal" <!--子元素动画顺序, normal(顺序) reverse(倒序) random(随机)-->
android:animation = "@anim/anim_item" <!--子元素动画-->
/>
2:在viewGroup中使用
<ListView
android:layoutAnimation="@anim/anim_layout"
/>
3:java代码的实现通过LayoutAnimationController来实现
Animation animation = AnimationUtil.loadAnimation(this, R.layout.anim_item);
LayoutAnimationController controller = new LayoutANimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
listview.setLayoutAnimaton(controller)
Actiity的切换效果:
activity有默认的切换效果,这个效果我们可以自定义,主要用到overridePendingTransition(int enterAnim, int exitAnim)
这个方法必须在startActivity和finish之后被调用才有效。
enterAnim activity被打开时的动画 exitAnim activity被暂停时的动画,
Fragment切换也可以有动画