基本动画
帧动画
帧动画(Frame-by-frame Animations)从字面上理解就是一帧挨着一帧的播放图片,就像放电影一样。和补间动画一样可以通过xml实现也可以通过java代码实现。
a) 首先需要在res目录下创建drawable目录,再新建xml文件并指定播放形式和资源引用。
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false"><!--oneshot为true表示播放一次,false是重复播放 -->
<!--duration:画面的播放时间,单位是毫秒 -->
<item android:drawable="@mipmap/image_1" android:duration="200" />
<item android:drawable="@mipmap/image_2" android:duration="200" />
<item android:drawable="@mipmap/image_3" android:duration="200" />
<item android:drawable="@mipmap/image_4" android:duration="200" />
<item android:drawable="@mipmap/image_5" android:duration="200" />
<item android:drawable="@mipmap/image_6" android:duration="200" />
</animation-list>
b) 在布局中创建ImageView,然后写上如下代码
public class MainActivity extends AppCompatActivity {
private AnimationDrawable mDrawable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView = (ImageView) findViewById(R.id.iv_image);
imageView.setBackgroundResource(R.drawable.frame_animation);
mDrawable = (AnimationDrawable) imageView.getBackground();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mDrawable.start();
return true;
}
return super.onTouchEvent(event);
}
}
补间动画
渐变动画
渐变动画是用来修改图片的透明度等操作,基本语法如下:
XML节点 | 功能说明 | |
---|---|---|
alpha | 渐变透明度动画效果 | |
fromalpha | 属性为动画起始时透明度 | 0.0表示完全透明 1.0表示完全不透明 以上取值0.0-1.0之间的float数据类型的数字 |
toAlpha | 属性为动画结束时透明度 |
使用代码实现渐变动画:
AlphaAnimation aa = new AlphaAnimation(0.0f, 1.0f);
// 设置播放时间
aa.setDuration(2 * 1000);
// 设置重复次数
aa.setRepeatCount(2);
// 设置倒叙播放
aa.setRepeatMode(Animation.REVERSE);
imageView.setAnimation(aa);
XML资源实现渐变动画:
<alpha
android:fromAlpha=“0.1”
android:toAlpha=“1.0”
android:duration=“3000”/>
缩放动画
缩放动画是用来修改图片的大小等操作,基本语法如下:
XML节点 | 功能说明 | |
---|---|---|
Scale | 渐变尺寸伸缩动画效果 | |
fromXScale[float] fromYScale[float] | 为动画起始时,X、Y坐标上的缩伸尺寸 | 0.0表示收缩到没有,1.0表示正常无伸缩 值小于1.0表示收缩,值大于1.0表示放大 |
toXScale[float toYScale[float]] | 为动画结束时,X、Y坐标上的伸缩尺寸 | |
pivotX[float] pivotY[float] | 为动画相对于物体的X、Y坐标的开始位置 | 属性值说明:从0%~100%中取值,50%位物体的X或Y方向坐标上的中点位置。 |
使用代码实现缩放动画:
ScaleAnimation sa = new ScaleAnimation(0.1f, 2.0f, 0.1f, 2.0f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
// 设置播放的时间
sa.setDuration(2 * 1000);
// 设置播放次数
sa.setRepeatCount(2);
// 设置倒叙播放
sa.setRepeatMode(Animation.REVERSE);
imageView.startAnimation(sa);
XML资源实现缩放动画:
<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:startOffset=“700”
android:duration=”700″
android:repeatCount=”10″/>
位移动画
位移动画是用来修改图片的位置等操作,基本语法如下:
XML节点 | 功能说明 | |
---|---|---|
Transtate | 画面转换位置移动动画效果 | |
fromXDeita toXDeita | 为动画、结束起始时X坐标上的位置 | |
fromYDeita toYDeita | 为动画、结束起始时Y坐标上的位置 |
使用代码实现位移动画:
TranslateAnimation ta = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 3.0f,
Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 3.0f);
// 设置播放时间
ta.setDuration(2 * 1000);
// 设置播放次数
ta.setRepeatCount(2);
// 设置倒叙播放
ta.setRepeatMode(Animation.REVERSE);
imageView.startAnimation(ta);
XML资源实现位移动画:
<translate
android:fromXDelta=”30″
android:toXDelta=”-80″
android:fromYDelta=”30″
android:toYDelta=”300″
android:duration=”2000″ />
旋转动画
旋转动画是用来修改图片的角度等操作,基本语法如下:
XML节点 | 功能说明 | |
---|---|---|
Rotate | 画面转移旋转动画效果 | |
fromDegrees | 为动画起始时物体的角度 | 当角度为负数---表示逆时针旋转 当角度为整数---表示顺时针旋转 (负数from---to整数:顺时针旋转) (负数from---to负数:逆时针旋转) (正数from---to正数:顺时针旋转) (正数from---to负数:逆时针旋转) |
toDegrees | 动画结束时物体旋转的角度可以大于360度 | |
pivotX pivotY | 为动画相对于物体的X、Y坐标的开始位 | 说明:以上两个属性值从0%~100%中取值 50%位物体的X或Y方向坐标上中点位置 |
使用代码实现旋转动画:
RotateAnimation ra = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
// 设置播放时间
ra.setDuration(2 * 1000);
// 设置播放次数
ra.setRepeatCount(2);
// 设置的倒叙播放
ra.setRepeatMode(Animation.REVERSE);
imageView.startAnimation(ra);
XML资源实现旋转动画:
<rotate
android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
android:fromDegrees=”0″
android:toDegrees=”+350″
android:pivotX=”50%”
android:pivotY=”50%”
android:duration=”3000″ />
动画集合
动画集是将上述动画进行合并到一起,具体请参看代码:
AnimationSet set = new AnimationSet(false);
.
// 动画实现省略
.
// 将所有动画添加到动画集
set.addAnimation(aa);
set.addAnimation(sa);
set.addAnimation(ta);
set.addAnimation(ra);
imageView.startAnimation(set);
对于动画事件,Android也提供了对应的监听回调,要添加相应的监听方法,代码如下所示:
animation.setAnimationListener(new AnimationListener() {
/**动画开始时回调*/
@Override
public void onAnimationStart(Animation animation) {
}
/**动画重播时回调*/
@Override
public void onAnimationRepeat(Animation animation) {
}
/**动画结束时回调*/
@Override
public void onAnimationEnd(Animation animation) {
}
});
实现Activity进出动画
slide_in_left.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:zAdjustment="top">
<translate
android:duration="300"
android:fromXDelta="-100.0%p"
android:toXDelta="0.0" />
</set>
slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:zAdjustment="top">
<translate
android:duration="300"
android:fromXDelta="100.0%p"
android:toXDelta="0.0" />
</set>
slide_out_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:zAdjustment="top">
<translate
android:duration="300"
android:fromXDelta="0.0"
android:toXDelta="-100.0%p" />
</set>
slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:zAdjustment="top">
<translate
android:duration="300"
android:fromXDelta="0.0"
android:toXDelta="100.0%p" />
</set>
在style.xml中AppTheme里配置Activity的动画
<!--Activity进场。出场动画-->
<style name="AnimationActivity" parent="@android:style/Animation.Activity">
<!--用于设置打开新的Activity并进入新的Activity展示的动画-->
<item name="android:activityOpenEnterAnimation">@anim/slide_in_left</item>
<!--用于设置打开新的Activity并销毁之前的Activity展示的动画-->
<item name="android:activityOpenExitAnimation">@anim/slide_out_right</item>
<!--用于设置关闭当前Activity进入上一个Activity展示的动画-->
<item name="android:activityCloseEnterAnimation">@anim/slide_in_right</item>
<!--用于设置关闭当前Activity时展示的动画-->
<item name="android:activityCloseExitAnimation">@anim/slide_out_left</item>
</style>
还可以在Activity的startActivity和finish方法中进行设置:
@Override
public void startActivity(Intent intent) {
super.startActivity(intent);
overridePendingTransition(R.anim.slide_in_left,R.anim.slide_out_right);
}
@Override
public void finish() {
super.finish();
overridePendingTransition( R.anim.slide_in_right,R.anim.slide_out_left);
}
布局动画
所谓布局动画是指作用在ViewGroup上,给VewGroup增加View时添加动画过渡效果。最简单的布局动画是在ViewGroup的XML中,使用以下代码来打开布局动画:
android:animateLayoutChanges="true"
设置该属性后,当ViewGroup添加View时,子View会呈现逐渐显示的过渡效果,这个效果是Android默认的,且无法使用自定义的动画进行替换。如果想自定义子View
的过渡效果,可以使用LayoutAnimationController类来完成相关操作。
LinearLayout ll = (LinearLayout) findViewById(R.id.ll_root);
// 设置过渡动画
ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1);
sa.setDuration(2000);
// 设置布局动画的显示属性
LayoutAnimationController lac = new LayoutAnimationController(sa, 0.5F);
lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
// 为ViewGroup设置布局动画
ll.setLayoutAnimation(lac);
LayoutAnimationController的第一个参数是需要作用的动画,dirge参数是每个子View显示delay时间。
当delay时间不为0时,可以设置子View显示的顺序:
LayoutAnimationController.ORDER_NORMAL -- 顺序
LayoutAnimationController.ORDER_RANDOM -- 随机
LayoutAnimationController.ORDER_REVERSE -- 反序