动画效果编程基础——Animation
一、Android动画类型
Android的animation由四种类型组成
1、XML中
Alpha 渐变透明度动画效果
Scale 渐变尺寸伸缩动画效果
Translate 画面转换位置移动动画效果
Rotate 画面转移旋转动画效果
2、JavaCode中
AlphaAnimation 渐变透明度动画效果
ScaleAnimation 渐变尺寸伸缩动画效果
TranslateAnimation 画面转换位置移动动画效果
RotateAnimation 画面转移旋转动画效果
二、Android动画模式
Animation主要有两种动画模式
(1)、tweened animation(渐变动画)
XML中 JavaCode
Alpha AlphaAnimation
Scale ScaleAnimation
(2)Frame by frame (画面转换动画)
XML中 JavaCode
Translate TranslateAnimation
Rotate RotateAnimation
三、如何在XML文件中定义动画
1、打开Eclipse,新建Android工程
2、在res目录中新建anim文件夹
3、在anim目录中新建一个myanim.xml(注意文件名小写)
加入XML的动画代码
(1)、anim_alpha.xml文件中
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 透明度控制动画效果alpha
浮点型值:
fromAlpha 动画起始时透明度
toAlpha 动画结束时透明度
说明:0.0 完全透明
1.0 完全不透明
以上值取0.0-1.0之间的 float数据类型的数字
长整型:
duration 为动画持续时间
说明:时间以毫秒为单位
-->
<alpha android:fromAlpha="0.1"
android:toAlpha="1.0"
android:duration="3000"/>
</set>
(2)、anim_scale.xml文件中
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 尺寸伸缩动画效果 scale
属性:interpolator 指定一个动画的插入器
有三种动画插入器:
accelerate_decelerate_interpolator 加速-减速 动画插入器
accelerate_interpolator 加速-动画插入器
decelerate_interpolator 减速-动画插入器
其他的属于特定的动画效果
浮点型值:
fromXScale 动画起始时 X坐标上的伸缩尺寸
toXScale 动画结束时 X坐标上的伸缩尺寸
fromYScale 动画起始 Y时坐标上的伸缩尺寸
toYScale 动画结束时 Y坐标上的尺寸
说明:以上四种属性值
0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
pivotX 动画相对于物件的X坐标的开始位置
pivotY 动画相对于武将的Y坐标的开始位置
说明:以上两个属性值 从0%-100%中取值
长整型:
duration 动画持续时间
说明:时间以毫秒为单位
布尔型值:
fillAfter 当设置为true,该动画转化在动画结束后被应用
-->
<scale android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="0.0"
android:toXScale="1.4"
android:fromYScale="0.0"
android:toYScale="1.4"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="700"/>
</set>
(3)、anim_translate.xml文件中
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!-- translate 位置转移动画效果
整型值:fromXDelta 动画起始时 X坐标上的位置
toXDelta 动画结束时 X坐标上的位置
fromYDelta 动画起始时 Y坐标上的位置
toYDlta 动画结束时 Y坐标上的位置
注意:没有指定fromXTra toXType fromYType toYType 时候,默认是以自己为相对参照物
长整型:duration 为动画持续时间
时间以毫秒为单位-->
<translate android:fromXDelta="30"
android:toXDelta="-80"
android:fromYDelta="30"
android:toYDelta="300"
android:duration="2000"/>
</set>
(4)、anim_rotate.xml文件中
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!-- rotate旋转动画效果
属性:interpolator 指定一个动画的插入器
有三种动画插入器:
accelerate_decelerate_interpolator 加速-减速 动画插入器
accelerate_interpolator 加速-动画插入器
decelerate_interpolator 减速-动画插入器
其他的属于特定的动画效果
浮点整型值:
fromDegrees 为动画起始时物件的角度
toDegrees 为动画起始时物件旋转的角度 可以大于360度
说明:当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转
负数from——to负数:逆时针旋转
正数from——to正数:顺时针旋转)
pivotX 为动画相对于物件的X坐标的开始位置
pivotY 为动画相对于物件的Y坐标的开始位置
说明:以上两个属性值 从0%——100%中取值
50%为物件的X或Y方向坐标上的中点位置
长整型类型:
duration 为动画持续时间
说明:时间以毫秒为单位
-->
<rotate android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromDegrees="0"
android:toDegrees="+350"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000"/>
</set>
四、在Java代码中
(1)、在main.xml文件中定义四个按钮
<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" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="alpha" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="scale" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="translate" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="rotate" />
</LinearLayout>
(2)、在src代码中
private Button btn_alpha;
private Button btn_scale;
private Button btn_translate;
private Button btn_rotate;
//在代码中定义 动画实例对象
private Animation myAnimation_Alpha;
private Animation myAnimation_Scale;
private Animation myAnimation_Translate;
private Animation myAnimation_Rotate;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_alpha = (Button)findViewById(R.id.button1);
btn_scale = (Button)findViewById(R.id.button2);
btn_translate = (Button)findViewById(R.id.button3);
btn_rotate = (Button)findViewById(R.id.button4);
btn_alpha.setOnClickListener(this);
btn_scale.setOnClickListener(this);
btn_translate.setOnClickListener(this);
btn_rotate.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
//myAnimation_Alpha = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.anim_alpha);
myAnimation_Alpha = new AlphaAnimation(0.1f, 1.0f);
myAnimation_Alpha.setDuration(5000);
btn_alpha.startAnimation(myAnimation_Alpha);
break;
case R.id.button2:
//myAnimation_Scale = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.anim_scale);
myAnimation_Scale = new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
myAnimation_Scale.setDuration(3000);
btn_scale.startAnimation(myAnimation_Scale);
break;
case R.id.button3:
//myAnimation_Translate = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.anim_translate);
myAnimation_Translate = new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f);
myAnimation_Translate.setDuration(5000);
btn_translate.startAnimation(myAnimation_Translate);
break;
case R.id.button4:
//myAnimation_Rotate = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.anim_rotate);
myAnimation_Rotate = new RotateAnimation(0.0f, +350.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
myAnimation_Rotate.setDuration(6000);
btn_rotate.startAnimation(myAnimation_Rotate);
break;
default:
break;
}
}
其中在java代码中实现的方式有两种:
(1)、使用AnimationUtils类的静态方法loadAnimation()来加载XML中的动画XML文件。
Eg:AnimationUtils.loadAnimation(this,R.anim.anim_rotate);
(2)、根据各自的构造方法来初始化一个实例对象
Eg:myAnimation_Rotate = new RotateAnimation(0.0f, +350.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);