您的位置:首页 > 移动开发 > Android开发

七、Android动画

2016-03-19 16:44 423 查看
Android的动画可以分为3种,View动画,帧动画和属性动画,其实帧动画也属于

View动画的一种,只不过它和平移,旋转等常见的View动画在表现形式上面略有

不同而已。

属性动画通过动态地改变对象的属性从而达到动画效果。

1.View动画种类

AlphaAnimation, RotateAnimation, ScaleAnimation, TranslateAnimation

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true" | "false"] >
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float" />
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
<set>
...
</set>
</set>


这四种动画既可以通过XML来定义,也可以通过代码来动态创建,对于view动画来说,建议采用XML来定义动画。

set表示动画集合,对应AnimationSet类,可以包含若干个动画。

属性:

android:interpolator表示动画集合采用的插值器,插值器影响动画的速度,比如非匀速动画就需要通过插值器来控制动画的播放过程。可以不指定。默认@android:anim/accelerate_decelerate_interpolator,即加速减速插值器。

android:shareInterpolator表示集合中的动画是否和集合共享一个插值器,如果集合不指定插值器,那么子动画就需要单独指定所需的插值器或者使用默认值。

translate:表示平移动画,对应TranslateAnimation类,可以使一个View在水平和竖直方向完成平移的动画效果。

android:fromXDelta表示X的起始值,比如0;

android:toXDelta表示X的结束值,比如100;

android:fromYDelta表示Y的起始值;

android:toYDelta表示Y的结束值

scale:表示缩放动画,对应ScaleAnimation,可以使View具有放大或者缩小的动画效果。

android:fromXScale水平方向缩放的起始值,比如0.5;

android:toXScale水平方向缩放的结束值,比如1.2;

android:fromYScale竖直方向缩放的起始值;

android:toYScale竖直方向缩放的结束值;

android:pivotX缩放轴点的x坐标,它会影响缩放的效果;

android:pivotY缩放轴点的y坐标,它会影响缩放的效果;

rotate表示旋转动画,对应RotateAnimation类。

android:fromDegrees旋转开始的角度,比如0;

android:toDegrees旋转结束的角度,比如180;

android:pivotX旋转轴点的x坐标;

android:pivotY旋转轴点的y坐标;

alpha表示透明度动画,对应AlphaAnimation。

android:fromAlpha表示透明度的起始值,比如0.2;

android:toAlpha表示透明度的结束值,比如1;

还有些常用属性,android:duration持续时间android:fillAfter动画结束之后View是否停留在结束位置。

例子:

<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="1.0"
android:toXScale="1.4"
android:fromYScale="1.0"
android:toYScale="0.6"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="700" />
<set
android:interpolator="@android:anim/accelerate_interpolator"
android:startOffset="700">
<scale
android:fromXScale="1.4"
android:toXScale="0.0"
android:fromYScale="0.6"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="400" />
<rotate
android:fromDegrees="0"
android:toDegrees="-45"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="400" />
</set>
</set>


2.帧动画

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource_name"
android:duration="integer" />
</animation-list>


例子:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>


ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();


3.View动画的特殊使用场景

3.1.LayoutAnimation

<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.5"
android:animationOrder="reverse"
android:animation="@anim/anim_item"/>


android:delay表示子元素开始动画的时间延迟,比如子元素入场动画的时间周期为300ms,那么0.5表示每个子元素都需要延迟150ms才能播放入场动画,总的来说,第一个子元素推迟150ms开始播放入场动画,第二个子元素延迟300ms开始播放入场动画,依次类推。

android:animationOrder表示子元素动画的顺序,有三种选项,normal,reverse和random其中normal表示顺序显示,即排在前面的子元素先播放入场动画,reverse表示逆向显示,即排在后面的子元素先开始播放入场动画,random则是随机播放入场动画。

android:animation为子元素指定具体的入场动画。

<?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>


为ViewGroup指定android:layoutAnimation属性。

<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutAnimation="@anim/anim_layout"
android:background="#fff4f7f9"
android:cacheColorHint="#00000000"
android:divider="#dddbdb"
android:dividerHeight="1.0px"
android:listSelector="@android:color/transparent" />


还可以通过代码来指定:

Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_item);
LayoutAnimationController controller = new LayoutAnimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
listView.setLayoutAnimation(controller);


3.2.Activity的切换效果

Activity有默认的切换效果,这个效果我们是可以自定义的,主要用到

overridePendingTransition(int enterAnim, int exitAnim)


这个方法。这个方法必须在startActivity()或者finish()之后调用才能生效。

参数含义:

enterAnim—Activity被打开时,所需要的动画资源id;

exitAnim—Activity被暂停时,所需的动画资源id;

当启动一个Activity时,可以按照如下方式添加自定义切换效果:

Intent intent = new Intent(this, TestActivity.class);
startActivity(intent);


overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);


当Activity退出时,也可以指定切换效果:

@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);
}


4.属性动画

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: