Android动画-视图动画View Animation
可能筒子们经常会遇到一条面试题“android有几种动画?”对吧(这条面试题真的是烂大街了,能不能别出这道题了),
一般分为三种:
视图动画View Animation
帧动画Drawable Animation
属性动画Property Animation
话不多说,本篇先简单介绍一下视图动画。
(本篇内容为初级介绍,没有该需求的让让 让让哈)
视图动画是个什么鬼东西
视图动画简单来讲,他支持四种变换,分别为平移(TranslateAnimation)、缩放(ScaleAnimation)、旋转(RotateAnimation)、透明(AlphaAnimation)。这4种动画效果是可以单独运行的,也可以是组合运行的,比如你想边移动边缩小,那就利用平移+缩放就可以完成这个动画效果,以此类推。接下来我们分别介绍一下这四种效果。
平移
顾名思义,就是在做一种移动的动画,比如左右移动啊这些只是一个位置的移动。
使用方法
举个用xml实现平移动画的栗子:
首先在res新建一个anim文件夹,接着在里面创建一个xml文件,姑且叫translate_anim.xml吧,在里面写上以下内容
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:duration="3000"
android:fromXDelta="50%"
android:fromYDelta="50%"
android:toXDelta="50%p"
android:toYDelta="50%p">
</translate>
然后在代码里加载该xml并执行动画
Animation animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);
iv.startAnimation(animation);
这样就ok了
如果你不开心,想要用代码实现,也行
TranslateAnimation translateAnimation = new TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta);
translateAnimation.setDuration(4000);
translateAnimation.setFillAfter(true);
iv.startAnimation(translateAnimation);
具体的xy轴筒子们自己调整哈,这里只是简单介绍下用法
缩放
缩放还要介绍什么意思吗,来直接看代码,跟上面一样,先来个xml
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.0"
android:toYScale="1.0">
</scale>
然后在代码里加载该xml并执行动画
Animation animation = AnimationUtils.loadAnimation(this, R.anim.scale_anim);
iv.startAnimation(animation);
代码实现的话
ScaleAnimation scaleAnimation = new ScaleAnimation(float fromX, float toX, float fromY, float toY);
scaleAnimation.setDuration(3000);
mImage.startAnimation(scaleAnimation);
ScaleAnimation还有另外两个重载,有需要的可以点进类里查看
旋转
来xm...
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:pivotX="50%"
android:pivotY="50%"
android:fromDegrees="0"
android:toDegrees="90">
</rotate>
然后在代码里加载该xml并执行动画
Animation animation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim);
iv.startAnimation(animation);
代码实现的话
RotateAnimation rotateAnimation = new RotateAnimation(float fromDegrees, float toDegrees);
rotateAnimation.setDuration(3000);
mImage.startAnimation(rotateAnimation);
透明度
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="2000">
</alpha>
然后在代码里加载该xml并执行动画
Animation animation = AnimationUtils.loadAnimation(this, R.anim.alpha_anim);
iv.startAnimation(animation);
代码实现的话
AlphaAnimation alphaAnimation = new AlphaAnimation(float fromAlpha, float toAlpha);
alphaAnimation.setDuration(3000);
mImage.startAnimation(alphaAnimation);
以下简单介绍了一下4种动画效果的写法,简单来讲,其实都是差不多的方式,如果xml方式的话,先创建好xml,写好数组,然后用AnimationUtils.loadAnimation(this, R.anim.你的xml),最后调用控件的startAnimation()方法就行了。
当然这几种效果是可以混合的,只要把xml几个写在一起,用set标签包起来就行 比如
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android">
<!--平移动画标签-->
<translate
android:fromXDelta="0%p"
android:toXDelta="20%p"
android:fromYDelta="0%p"
android:toYDelta="20%p"
android:duration="4000"/>
<!--缩放动画标签-->
<scale
android:fromXScale="1.0"
android:toXScale="0.2"
android:fromYScale="1.0"
android:toYScale="0.2"
android:pivotX="50%"
android:pivotY="50%"
android:duration="4000"/>
</set>
然后执行他就o了
什么,用代码怎么写?这样写(好懒,拷一份好了)
AnimationSet animationSet1 = new AnimationSet(false);//一级集合
ScaleAnimation scaleAnimation1 = new ScaleAnimation(1, 1.4f, 1, 1.4f, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
AnimationSet animationSet2 = new AnimationSet(true);//二级集合
ScaleAnimation scaleAnimation2 = new ScaleAnimation(1.4f, 0, 1.4f, 0, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
RotateAnimation rotateAnimation = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
animationSet2.addAnimation(scaleAnimation2);
animationSet2.addAnimation(rotateAnimation);
animationSet2.setInterpolator(new DecelerateInterpolator());
animationSet2.setDuration(2000);
animationSet2.setStartOffset(2000);
animationSet1.addAnimation(scaleAnimation1);
animationSet1.addAnimation(animationSet2);
animationSet1.setInterpolator(new AccelerateDecelerateInterpolator());
animationSet1.setDuration(2000);
mImage.startAnimation(animationSet1);
动画监听
我们还可以给动画设置一个监听器,来监听动画的变化,比如
translateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
//动画开始
}
@Override
public void onAnimationEnd(Animation animation) {
//动画结束
}
@Override
public void onAnimationRepeat(Animation animation) {
//动画重复
}
});
layoutAnimation
layoutAnimation也是一个view动画,不过他是针对viewgroup,一般都是用来做为viewgroup一开始加载的时候的动画,比如listview加载的时候的动画,那我们来顺便看看怎样快速搞定
老规矩,先用xml,这次我们先创建一个layout_anim.xml文件
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/layout_item_anim_set"
android:animationOrder="normal"
android:delay="0.5">
</layoutAnimation>
接着我们在创建一个layout_item_anim_set.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:interpolator="@android:anim/accelerate_interpolator"
android:shareInterpolator="true">
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"/>
<translate
android:fromXDelta="500"
android:toXDelta="0"/>
</set>
最后在listview标签加上
<ListView
android:layoutAnimation="@anim/layout_anim"
/>
ok,如果用代码的话,layout_item_anim_set.xml先创建(当然你也可以用代码实现一个),然后
Animation animation = AnimationUtils.loadAnimation(this, R.anim.layout_item_anim_set);
LayoutAnimationController controller = new LayoutAnimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
listview.setLayoutAnimation(controller);
这样listview一开始加载的时候就会有动画了。
好了,视图动画的介绍就先简单介绍到这里,下一篇我们讲帧动画。
上一篇: php招聘
下一篇: 方法定义及调用 练习