动画分类
1 配置文件方式 /res/anim – alpha,scale, translate,rotate
使用的时候加载文件AnimationUtils.loadAnimation :
Animation scale = AnimationUtils.loadAnimation(TweenActivity.this,R.anim.scale_anim);
img.startAnimation(scale);
2 java代码方式 AlphaAnimation ScaleAnimation, TranslateAnimation , RotateAnimation
当一些参数需要计算, 动态确定 , 就使用代码方式, 否则使用配置文件方式
Animation alpha = new AlphaAnimation(0.1f, 1.0f);
alpha.setDuration(5000);
img.startAnimation(alpha);
Tween Animation:变换动画分类:
- alpha渐变透明度动画
- scale渐变尺寸动画
- translate位置移动动画
- rotate旋转动画
Duration: 动画持续时间毫秒
fillAfter: true的话 动画转化在动画结束后被应用
fillBefore: true的话 动画转化在动画开始前被应用
interpolator: 动画插入器 加速,减速插入器
repeatCount: 动画重复次数
repateMode: 顺序重复/倒序重复
startOffset: 动画之间的时间间隔
常用属性:
fromAlpha 动画起始透明度
toAlpha 终止时透明度
xml文件方式示例:
//Activity
case R.id.alpha: {
loadAnimation = AnimationUtils.loadAnimation(this, R.anim.alpha);
image.startAnimation(loadAnimation);
break;
}
//alpha.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha android:duration="1000" android:fromAlpha="0.1" android:toAlpha="1.0" >
</alpha>
</set>
常用属性:
fromX,toX x坐标伸缩尺寸
fromY,toY Y坐标伸缩尺寸
pivoX,pivoY 伸缩动画相对于,x,y坐标开始的位置
case R.id.scale: {
loadAnimation = AnimationUtils.loadAnimation(this, R.anim.scale);
image.startAnimation(loadAnimation);
break;
}
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale android:duration="2000" android:fillAfter="false" //动画完成后是否保持最后的状态, false不保存, 即回到原本状态 android:fromXScale="0.0" android:fromYScale="0.0" //动画插入器, 先加速后减速 android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50%" //设置缩放中心 , 为中心点 android:pivotY="50%" //设置缩放中心 , 为中心点 android:toXScale="1.0" android:toYScale="1.0" />
</set>
常用属性:
fromXdelta , fromYDelta 起始X,Y
toXDelta, toYDelta 结束时X,Y
case R.id.translate: {
loadAnimation = AnimationUtils
.loadAnimation(this, R.anim.translate);
image.startAnimation(loadAnimation);
break;
}
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate android:duration="1000" android:fromXDelta="10" android:fromYDelta="10" android:toXDelta="100" android:toYDelta="100" />
</set>
常用属性:
fromDegree 起始角度
toDegree 终止角度
pivotX,pivotY 旋转中心点
case R.id.rotate: {
loadAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate);
image.startAnimation(loadAnimation);
break;
}
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<rotate android:duration="1000" android:fromDegrees="0" // 先加速后减速 android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toDegrees="+360" />
</set>
例1: 先动画A , 设置A的AnimationListener , 当onAnimationEnd触发(即A播放完毕)时, 开始播放B.
case R.id.continue_btn: {
loadAnimation = AnimationUtils
.loadAnimation(this, R.anim.translate);
image.startAnimation(loadAnimation);
//结束时准备调用的动画, 要在回调中使用, 所以要设置为final
final Animation loadAnimation2 = AnimationUtils.loadAnimation(this,
R.anim.rotate);
loadAnimation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation arg0) {
}
@Override
public void onAnimationRepeat(Animation arg0) {
}
@Override
public void onAnimationEnd(Animation arg0) {
// TODO Auto-generated method stub
image.startAnimation(loadAnimation2);
}
});
break;
}
例2: 使用动画集 AnimationSet ,其中定义动画A, B 为动画B设置startOffset , 其值为前一个动画播放所需要的时间
//startOffset 动画延迟时间
//Activity
case R.id.continue_btn2: {
loadAnimation = AnimationUtils.loadAnimation(this,
R.anim.continue_anim);
image.startAnimation(loadAnimation);
break;
}
//continue_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha android:duration="3000" android:fromAlpha="0.2" android:toAlpha="1.0" />
<alpha android:duration="3000" android:fromAlpha="1.0" // 上一个动画duration 3秒, 这里设置startOffset 延迟3秒, 于是实现了连续播放, 组合动画 android:startOffset="3000" android:toAlpha="0.2" />
</set>
例3: 循环闪烁 利用Animation 的setRepeatCount, setRepeatMode来实现动画循环
使用透明度动画循环
case R.id.flash: {
AlphaAnimation alphaAnimation = new AlphaAnimation(0.1f, 1.0f);
alphaAnimation.setDuration(100);
alphaAnimation.setRepeatCount(10);
// 倒序重复REVERSE 正序重复RESTART
alphaAnimation.setRepeatMode(Animation.REVERSE);
image.startAnimation(alphaAnimation);
break;
}
例4: Activity切换动画, 使用overridePendingTransition方法
参数1: 第二个activity 进入动画配置文件
参数2: 第一个activity退出动画配置文件
case R.id.change: {
Intent intent = new Intent(MainActivity.this, MainActivity2.class);
startActivity(intent);
//第一个参数指定新启动的activity由小变大zoom_in ,
//第二个参数指定当前activity 由大变小zoom_out
overridePendingTransition(R.anim.zoom_in, R.anim.zoom_out);
break;
}
//zoom_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/decelerate_interpolator" >
<scale android:duration="1000" android:fromXScale="0.1" android:fromYScale="0.1" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.0" android:toYScale="1.0" />
<alpha android:duration="1000" android:fromAlpha="0" android:toAlpha="1.0" />
</set>
//zoom_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/decelerate_interpolator" android:zAdjustment="top" >
<scale android:duration="@android:integer/config_mediumAnimTime" android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="50%p" android:pivotY="50%p" android:toXScale="0.1" android:toYScale="0.1" />
<alpha android:duration="@android:integer/config_mediumAnimTime" android:fromAlpha="1.0" android:toAlpha="0" />
</set>
为View Groups 添加动画
使用LayoutAnimationController , 来加载动画,应用到layout下每一个子view
例子中 R.anim.zoom_in和上面使用的是同样的文件
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.list_layout);
listView=(ListView) findViewById(R.id.listView);
List<String>list=new ArrayList<String>();
for(int i=0;i<20;i++)
{
list.add("测试数据"+i);
}
ArrayAdapter<String>adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
listView.setAdapter(adapter);
//生成布局动画控制器, 并加载动画
LayoutAnimationController lac=new LayoutAnimationController(AnimationUtils.loadAnimation(this, R.anim.zoom_in));
//设置动画顺序
lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
// 应用动画
listView.setLayoutAnimation(lac);
listView.startLayoutAnimation(); //按设置, 对子view动画依次播放
}
drawable下建xml文件, 用animation-list标签(item标签集合),
一个item标签定义要显示的drawable下图片(帧图),且指定显示它的时间(毫秒为单位), 如
//anim_list.xml , “@drawable/one” ,”@drawable/two” 这些都是准备好的图片 , 每幅图片停留时间为500毫秒
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/one" android:duration="500"/>
<item android:drawable="@drawable/two" android:duration="500"/>
<item android:drawable="@drawable/three" android:duration="500"/>
<item android:drawable="@drawable/four" android:duration="500"/>
<item android:drawable="@drawable/five" android:duration="500"/>
<item android:drawable="@drawable/six" android:duration="500"/>
</animation-list>
//使用该动画, 逐帧动画
case R.id.frame: {
image.setImageResource(R.drawable.anim_list);
break;
}