Android动画播放技术主要分两种,也就是补间动画和帧动画。这几天正好看完《轻松学Android开发》,特别基础的一本书。在3.5动画播放技术那章,我遇到了一个问题:在android stuio写的一个简单的帧动画,第一帧一直不消失,于是造成了重叠的效果(仅第一帧一直不消失,其他正常)。简单记录下动画和我的解决过程。
Android Animation
动画实现可以采用JavaCode(也就是New一个Animation的实例,进行相关操作)和定义xml文件然后加载它,这里我们采用第二种方法,也就是我先在res/anim定义好xx.xml,然后使用如下代码加载:
// 加载补间动画
Animation anim_tween = AnimationUtils.loadAnimation(MainActivity.this, R.anim.tween);
imageView = (ImageView) findViewById(R.id.image);
imageView.startAnimation(anim_tween);
//开始帧动画
images.setImageResource(R.drawable.frame);
AnimationDrawable drawable = (AnimationDrawable)images.getDrawable();
drawable.start();
接下来我们讲下怎么写动画的xml文件
Tween Animation
也就是补间动画,是指对场景里的对象不断进行图像变换来产生动画效果,可以实现对象的旋转、平移、缩放、渐变等。
alpha
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="10000"
/>
-
fromAlpha变换的起始透明度
-
toAlpha终止时的透明度,取值为0.0~1.0,0.0代表全透明
-
duration代表动画持续时长
scale
<scale
android:fromXScale="1.0"
android:toXScale="0.5"
android:fromYScale="1.0"
android:toYScale="0.5"
android:pivotX="50%"
android:pivotY="50%"
android:duration="6000"
></scale>
- pivotX(Y)是用于指定变换中心
- 1.0表示原始尺寸
translate
<translate
android:fromXDelta="0"
android:toXDelta="300"
android:fromYDelta="0"
android:toYDelta="300"
android:duration="5000"
></translate>
- 注明移动的起始和终止的X、Y
- 属性值不加后缀,如现在的0、300,是代表绝对值
- 属性以“%”结尾代表相对于自身比例
- 属性以“%p”结尾代表相对于父控件比例
rotate
<rotate
android:fromDegrees="0"
android:toDegrees="+360"
android:pivotX="50%"
android:pivotY="50%"
android:duration="5000"
></rotate>
- 指明旋转位置和结束位置,单位为角度
Frame Animation
也就是如同电影一样,通过顺序播放一系列事先加载的静态图片产生动画效果。
注意androidstudio需要在drawable目录下定义一个xml文件(而不是anim)
例如:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:duration="150" android:drawable="@drawable/run_anim1"/>
<item android:duration="150" android:drawable="@drawable/run_anim2"/>
<item android:duration="150" android:drawable="@drawable/run_anim3"/>
<item android:duration="150" android:drawable="@drawable/run_anim4"/>
<item android:duration="150" android:drawable="@drawable/run_anim5"/>
</animation-list>
- drawable图片帧的引用
- duration帧停留时间
- visible图片帧是否可见
结束语
其实播放帧动画时第一帧一直不消失,是因为书上教我写的代码是这样的:
images.setBackgroundResource(R.drawable.frame);
AnimationDrawable drawable = (AnimationDrawable)images.getBackground();
drawable.start();
简单的百度了下,发现有人和我错的一样也没解决:android studio 做了个帧动画,但是第一帧的图片一直不消失,求教。于是就自己稍微思考了下,由于我很不理解为什么得先把那些静态图片设置成Background,所以第一反应是出在这里,我想了想Background是显示一张图片当背景,正好符合第一帧图片一直不消失,所以把它改成了ImageResource,也就是前面的:
images.setImageResource(R.drawable.frame);
AnimationDrawable drawable = (AnimationDrawable)images.getDrawable();
drawable.start();
然后就神奇的好了。。
最后,一个简单的效果图: