首先,说一下,已经一个多月没写博客了,并没有偷懒,而是总觉得时间不够用,今天仔细想想,写一篇博客的时间还是可以挤出来的,只是自己没有安排好时间而已,毕竟这也算是对学过知识的一种总结,应该坚持,所以从今天开始,我又要继续了,对自己说一声,加油!
今天对Animation的学习做一个总结:
一直觉得动画很炫酷,学了动画之后才知道原来是这么回事!
安卓Animation分为两种:
(1)帧动画 Frame Animation :一张图片就是一帧,很多帧的不停切换便构成了动画
(2)补间动画 Tween Animation :对一张图片就行旋转(Rotate)、平移(Translate)、缩放(Scale)、透明度(Alpha)改变产生的动画效果
一、先是在 xml中设置动画资源,再在MainActivity中加载并开始动画
帧动画的实现:
1.在res资源文件下创建动画资源文件夹 anim,添加frame_anim.xml布局文件
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/img001"></item>
<item android:drawable="@drawable/img002"></item>
<item android:drawable="@drawable/img003"></item>
<item android:drawable="@drawable/img004"></item>
<item android:drawable="@drawable/img006"></item>
</animation-list>
2.在要显示的内容面板上设置背景为动画资源
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/content"
android:orientation="vertical"
android:background="@anim/frame_anim" //这里设置
tools:context="${relativePackage}.${activityClass}" >
</LinearLayout>
3.在MainActivity中设置当点击显示面板时开始动画
LinearLayout content=(LinearLayout)findViewById(R.id.content);
AnimationDrawable animation=(AnimationDrawable)content.getBackground(); //事件监听器里面写
animation.start();
补间动画的实现:
1.在anim动画资源文件夹中添加xml布局文件
旋转:
<rotate
android:interpolator="@android:anim/accelerate_decelerate_interpolator" //动画执行期间的变化速度,控制变换方式
android:fromDegrees="0" //起始角度
android:toDegrees="270" //结束角度
android:pivotX="0.5"
android:pivotY="0.5" //旋转中心 0.5,0.5表示旋转中心在图片的中心
android:duration="3000" //动画持续时间
xmlns:android="http://schemas.android.com/apk/res/android">
</rotate>
平移:
<translate
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="500"
android:toYDelta="500"
android:duration="3000"
xmlns:android="http://schemas.android.com/apk/res/android">
</translate>
缩放:
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="0"
android:toXScale="1"
android:fromYScale="0"
android:toYScale="1"
android:duration="3000"
xmlns:android="http://schemas.android.com/apk/res/android">
</scale>
透明度:
<alpha
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromAlpha="0"
android:toAlpha="1"
android:duration="3000"
xmlns:android="http://schemas.android.com/apk/res/android">
</alpha>
2.在MainActivity中加载动画资源并开始动画
Animation rotate_anim=AnimationUtils.loadAnimation(getApplicationContext(),R.anim.rotate_anim); //加载旋转动画
让某一图片实现这个动画效果
image.startAnimation(rotate_anim);
二、在MainActivity中添加动画资源并开始动画
补间动画的实现:
AlphaAnimation alpha_anim=new AlaphaAnimation(float fromDegree,float toDegree );
设置属性:
alpha_anim.setDuration( 1000); //持续时间
alpha.setFillAfter (boolean b) ; //动画结束后是否留在当前位置
alpha.setFillBefore(boolean b); //动画结束后是否回到起始位置
开始动画
image.startAnimation(alpha_anim);
alpha_anim.setStartOffset(); //设置动画开始前的时间
alpha_anim.setRepeatCount(); //重复次数
alpha_anim.setInterpolator(); //渐变方式
三、AnimationSet的使用
使用AnimationSet可以将几个动画组合成一个动画,
AnimationSet animationSet=new AnimationSet(true);
animationSet.addAnimation(alpha_anim);
animationSet.addAnimation(rotate_znim); //这样将透明度动画和旋转动画组合成一个动画
四、LayoutAnimationController的使用
LayoutAnimationController的作用就是可以是某一个Layout布局中的组件按照你所设定的动画的形式显示出来,其中所有的组件显示方式都是相同的
例如现在有一个ListView :那么如何让ListView的每一行逐行显示出来
1.设置显示方式动画:
ScaleAnimation scale_anim=new ScaleAnimation(0,1,0,1);
scale_anim.setDuration(1000);
2.设置LayoutAnimationController
LayoutAnimationController lacon=new LayoutAnimationController(scale_anim,0.5f); 0.5f指的是上一行和写一行显示的时间间隔;
为lacon设置属性: lacon.setOrder(); 设置显示的方向
3.将ListView和动画关联
ListView.setLayoutAnimation(lacon);
五、如何自定义一个Animation
1.创建一个类继承Animation,并重写其中的applyTransformation()方法
public class ZidingyiAnimation extends Animation {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
// TODO Auto-generated method stub
t.getMatrix().setTranslate(200*interpolatedTime, 200*interpolatedTime);
super.applyTransformation(interpolatedTime, t);
}
}
这里面通过矩阵变换来实现我们的动画,其中interpolatedTime是一个从0-1自增的数,即0,0.0000000......1,0.0000000000002一直到1
2.在MainActivity中获得我们定义的动画,并为其设置属性:
ZidingyiAnimation my_anim=new ZidingyiAnimation();
my_anim.setDuration(1000);
3.将动画和我们的图片关联
image.startAnimation(my_anim);
六、AnimationListener的使用
例如我们上面自定义的my_anim动画,我们可以为其设置动画监听事件
my_anim.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "结束,", Toast.LENGTH_SHORT).show();
}
});
在上面的每个方法里可以写我们的处理事件!
到此为止Animation的内容我所了解的就这么多了,以后学习中肯定还会遇到很多关于Animation的知识,再慢慢积累吧!