动画资源
Android SDK支持3种动画:属性动画,帧动画和补间动画。
属性动画
属性动画从API Level = 11(Android 3.0)才开始支持。
属性动画可以使对象的属性值在一定时间间隔内变化到某一值。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<objectAnimator
android:duration="2000"
android:propertyName="y"
android:valueTo="300"
android:valueType="intType"/>
<objectAnimator
android:duration="3000"
android:propertyName="x"
android:valueTo="220"
android:valueType="intType"/>
</set>
android:ordering属性指定< set>标签中动画的执行顺序,本例是按顺序执行,默认是同时执行。因此上述代码先将y属性值在2000毫秒内变为300,然后将对象的x属性值在3000毫秒内变为220.
import android.animation.AnimatorInflater;
import android.animation.AnimatorSet;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
/**
* Created by Wallace(wangj) on 2015/4/23 0023.
*/
public class MyActivity extends Activity{
private Button button;
private Move move;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.btn1);
move = new Move();
}
//对Move对象使用属性动画
class Move{
private int x;
private int y;
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
//垂直移动
button.layout(button.getLeft(),y,button.getRight(),y + button.getMeasuredHeight());
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
//水平移动
button.layout(x,button.getTop(),x + button.getMeasuredWidth(),button.getBottom());
}
}
//"Move"按钮的单击事件
public void onClick_Move(View view){
AnimatorSet set =(AnimatorSet) AnimatorInflater.loadAnimator(this,R.animator.proper_anim);
//设置要控制的对象
set.setTarget(move);
set.start();
}
}
帧动画
帧动画类似电影的播放。电影一般每秒至少播放25幅静态的图像(25帧)。
帧动画必须使用< animation-list>标签作为根节点,如果android:oneshot属性值为true,表示只播放一次,否则无限循环。
每个< item>表示一个静态图android:duration表示当前图像停留时间。使用帧动画资源需要先装载资源文件,并转换成AnimationDrawble对象,然后调用AnimationDrawble.start方法开始播放帧动画。
实现本例首先需要准备若干个图像文件,然后在res/anim目录建立资源文件
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/anim1" android:duration="50"/>
<item android:drawable="@drawable/anim2" android:duration="50"/>
<item android:drawable="@drawable/anim3" android:duration="50"/>
......
</animation-list>
java代码
public class MainActivity extends Activity implements OnClickListener{
private ImageView ivAnimView;
private AnimationDrawable animationDrawable;
private AnimationDrawable animationDrawable2;
private Button btnAddFrame;
@Override
public void onClick(View view){
switch(view.getId()){
//只播放一次动画
case R.id.btnOneShot:
//动态的修改android:oneshot属性
animationDrawable.setOneShot(true);
//需要先停止动画,然后再开始动画设置
animationDrawable.stop();
//开始播放
animationDrawable.start();
break;
//循环播放
case R.id.btnSartAnim:
animationDrawable.setOneShot(false);
animationDrawable.stop();
animationDrawable.start();
break;
//停止播放
case R.id.btnStopAnim:
//先停止第一个帧动画
animationDrawable.stop();
if(animationDrawable1 != null){
//如果添加了第2个帧动画,则同时停止第2个帧动画
animationDrawable1.stop();
}
break;
//在第1个帧动画后添加第2个帧动画
case R.id.btnAddFrame:
//装载第2个帧动画
animationDrawable1 = (AnimationDrawable) getResources().getDrawable(R.anim.frame_anim);
//设置第2个帧动画停留的时间,不管这段时间帧动画是否播放完,都切换到第二个帧动画
anmationDrawable.addFrame(animationDrawable1,2000);
btnAddFrame.setEnabled(false);
break;
}
}
....
记得添加帧动画到背景图
帧动画还可以通过AnimationDrawable.setAlpha方法设置透明度 0~255,0表示不透明,255表示完全透明。
补间动画
补间动画有移动,透明度,缩放和旋转的效果
可以通过配置xml文件或java代码来实现。
<?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:duration="3000"
android:fromAlpha="0.1"
android:toAlpha="1.0" />
<!-- 尺寸伸缩动画效果 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"/>
<!-- 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"/>
<!-- rotate旋转动画效果
浮点整型值:
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>
风格(Style)资源与主题(Theme)
风格资源使用< style>标签定义,需要在res/values目录中的任意xml文件格式的文件中设置,主要是用来成批设置属性。
<style name="ViewStyle">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_weight">1</item>
<item name="android:textSize">24sp</item>
<item name="android:gravity">center</item>
</style>
<!-- 继承系统的Theme风格资源改变主题 -->
<style name="AppTheme" parent="@android:style/Theme">
<item name="android:background">#fff</item>
</style>
然后就是引用。
风格资源可以设置系统属性,也可以设置自定义属性。
自定义属性,必须使用< declare-styleable>标签定义,每一个自定义属性用一个< attr>标签指定,使用format属性设置属性值的类型。