Android中的动画有三种:View动画,帧动画,属性动画。
View动画
View动画有四种效果:平移、缩放、旋转、透明度。
可以通过xml的形式定义动画,在res/anim/下新建xml动画文件
- 平移动画:
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="500"
android:toYDelta="300" />
fromXDelta:起始点X坐标
fromYDelta:起始点Y坐标
toXDelta:结束点X坐标
toYDelta:结束点Y坐标
- 缩放动画
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="1"
android:fromYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0.3"
android:toYScale="0.5" />
fromXScale:起始长度比例
fromYScale:起始高度比例
toXScale:结束长度比例
toYScale:结束高度比例
pivotX:缩放中心点X坐标位置
pivotY:缩放中心点Y坐标位置
- 旋转动画
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" />
fromDegrees:起始角度
toDegrees:结束角度
pivotX:旋转中心X坐标位置
pivotY:旋转中心Y坐标位置
- 透明度动画
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1"
android:toAlpha="0.3" />
fromAlpha:起始透明度
toAlpha:结束透明度
- 多种动画组合使用
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:duration="3000">
<translate
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="100"
android:toYDelta="200" />
<rotate
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" />
<alpha
android:fromAlpha="1"
android:toAlpha="0.5" />
<scale
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.5"
android:toYScale="1.5" />
</set>
fillAfter:结束后状态 true-保留动画结束的状态 false-恢复到起始状态
duration:动画时长
在Activity中使用测试动画效果,首先建一个布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context="com.test.animation.MainActivity">
<ImageView
android:id="@+id/iv"
android:layout_width="100dp"
android:layout_height="200dp"
android:layout_centerInParent="true"
android:src="@mipmap/ic_launcher" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/translate"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="平移" />
<Button
android:id="@+id/scale"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="缩放" />
<Button
android:id="@+id/rotate"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="旋转" />
<Button
android:id="@+id/alpha"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="透明度" />
<Button
android:id="@+id/set"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="组合" />
</LinearLayout>
</RelativeLayout>
是这个样子的
完成逻辑,这里用了ButterKnife来绑定控件和点击事件
package com.test.animation;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
public class MainActivity extends AppCompatActivity {
@InjectView(R.id.iv)
ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
}
@OnClick({R.id.translate, R.id.scale, R.id.rotate, R.id.alpha, R.id.set})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.translate:
setAnimation(R.anim.anim_translate);
break;
case R.id.scale:
setAnimation(R.anim.anim_scale);
break;
case R.id.rotate:
setAnimation(R.anim.anim_rotate);
break;
case R.id.alpha:
setAnimation(R.anim.anim_alpha);
break;
case R.id.set:
setAnimation(R.anim.set_anim);
break;
}
}
private void setAnimation(int resId) {
Animation anim = AnimationUtils.loadAnimation(this, resId);
anim.setFillAfter(true);
anim.setDuration(3000);
iv.startAnimation(anim);
}
}
源码地址:我是传送门!!
更详细的View动画各属性及用法介绍可以参考:
Android应用开发之所有动画使用详解