您的位置:首页 > 移动开发 > Android开发

Android:几种动画的使用(Tween动画、Frame动画、属性动画)

2016-11-17 14:56 513 查看
一、Tween动画:
1.平移动画(TranslateAnimation):
xml方式(文件放在res/anim目录下):
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"     //set表示动画集合,可放各个动画组合
android:interpolator="@android:anim/decelerate_interpolator"    //插值器,这里为加速减速插值器,用于加速减速以及其他等效果
android:duration="500"           //float类型,播放动画所持续的时间,单位为毫秒
android:fillAfter="true" >       //是否停留在结束位置
<translate
android:fromXDelta="0%"        //从x轴起始值开始平移
android:fromYDelta="0%"        //从y轴起始值开始平移
android:toXDelta="100%"        //延x轴平移至结束值
android:toYDelta="100%" />     //延y轴平移至结束值
</set>

代码方式:
TranslateAnimation animation = new TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta);
animation.setDuration(500);


2.缩放动画(ScaleAnimation):
xml方式(文件放在res/anim目录下):
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"   //插值器,这里为加速减速插值器,用于加速减速以及其他等效果
android:duration="500"         //float类型,播放动画所持续的时间,单位为毫秒
android:fromXScale="0.5"       //x轴缩放起始值
android:fromYScale="0.5"       //y轴缩放起始值
android:toXScale="1.0"         //x轴缩放结束值
android:toYScale="1.0"         //y轴缩放结束值
android:pivotX="50%"           //x轴缩放中心点
android:pivotY="50%" />        //y轴缩放中心点

代码方式:
ScaleAnimation animation = new ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY);
animation.setDuration(500);


3.旋转动画(RotateAnimation):
xml方式(文件放在res/anim目录下):
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"   //常量速率插值器
android:duration="500"           //持续时间
android:fromDegrees="0"          //开始角度
android:toDegrees="+360"         //结束角度
android:pivotX="50%"             //x轴旋转中心点
android:pivotY="50%"             //y轴旋转中心点
android:repeatCount="-1"         //重复次数,-1为无限重复
android:repeatMode="restart"     //重复,还有一个值为reverse,返向旋转
android:startOffset="-1"
/>

代码方式:
RotateAnimation animation = new RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY);
animation.setDuration(500);


4.透明度动画(AlphaAnimation):
xml方式(文件放在res/anim目录下):
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"           //持续时间
android:fromAlpha="0.0"          //开始透明度,0为全透明
android:toAlpha="1.0" />         //结束透明度,1为不透明

代码方式:
AlphaAnimation animation= new AlphaAnimation(float fromAlpha, float toAlpha);
animation.setDuration(500);


5.执行动画:
ImageView iv = ...;
Animation animation = AnimationUtils.loadAnimation(context, R.anim.动画文件名);
animation.setAnimationListener(new AnimationListener() {

  @Override
  public void onAnimationStart(Animation animation) {  //动画开始时触发
  }

  @Override
  public void onAnimationRepeat(Animation animation) {  //动画重播时触发

  }

  @Override
  public void onAnimationEnd(Animation animation) {  //动画结束时触发
  
  }
});
iv.startAnimation(animation);


6.ListView动画效果(layoutAnimation的使用):
(1)定义动画文件(res/anim/目录下):
anim_list_item.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="1000"
android:fromXDelta="200%"
android:toXDelta="0%"/>
</set>
anim_list.xml文件:
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
  android:delay="0.5"                       //延时时间,如果动画持续时间为200ms,0.5表示每个子动画延时为100ms,
  android:animationOrder="normal"           //子元素播放动画的顺序,normal(顺序播放)、reverse(逆序播放)、random(随机播放)
  android:animation="@anim/anim_list" />    //动画xml文件名


(2)给ListView加上android:layoutAnimation属性
布局方式:
<ListView
  android:id="@+id/recommend_listview"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:cacheColorHint="@color/transparent"
  android:divider="@color/transparent"
  android:dividerHeight="0dp"
  android:fadingEdge="none"
  android:layoutAnimation="@anim/anim_list"   //这句起作用
  android:listSelector="@color/transparent"
  android:scrollbars="none"/>

或者用代码方式:
ListView listView = ...;
Animation animation = AnimationUtils.loadAnimation(context, R.anim.anim_list);
LayoutAnimationController animController = new LayoutAnimationController(animation);
animController.setDelay(0.5f);
animController.setOrder(LayoutAnimationController.ORDER_NORMAL);
listView.setLayoutAnimation(animController);

7.Activity切换动画效果:
/**
* Activity基类,所有Activity继承此类
*/
public abstract class BaseActivity extends FragmentActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
//实现从右到左退打开界面,要放在onCreate之前执行
overridePendingTransition(R.anim.push_right_to_left, R.anim.push);
super.onCreate(savedInstanceState);
...
}

@Override
public void finish() {
super.finish();
//实现从左到右退出界面,要放在super.finish();后面
overridePendingTransition(R.anim.push, R.anim.push_left_to_right);
}

}


push_right_to_left.xml:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="150"
android:fromXDelta="100%"
android:toXDelta="0"/>

push.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="900"
android:fromXDelta="0"
android:toXDelta="0"/>
</set>

push_left_to_right.xml:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromXDelta="100"
android:toXDelta="200%"/>


二、Frame动画
(1)在res/anim目录下定义progress.xml:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">   //oneshot是否播放一次,设为false可无限循环
<item android:drawable="@drawable/a101" android:duration="50"/>
<item android:drawable="@drawable/a102" android:duration="50"/>
<item android:drawable="@drawable/a103" android:duration="50"/>
</animation-list>

(2)将动画xml作为View的背景:
<ImageView
android:id="@+id/detail_progress_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@anim/progress" />

(3)播放动画:
AnimationDrawable animationDrawable = (AnimationDrawable) mAnimation.getBackground();
animi.stop();   //停止播放
animi.start();  //开始播放


三、属性动画:
属性动画原理:多次调用(类似Timer定时调用)传入参数的set方法(比如translationY,就是不停的调用View的setTranslationY方法实现延Y轴平移),每次调用时传入的参数值都是改变后的值。
传入的控件属性必须set方法,如果只传一个参数,还需要get方法用于获取原值
属性参数为int类型:
ValueAnimator anim = ObjectAnimator.ofInt(控件, "控件属性", 参数...);
anim.setEvaluator(new IntEvaluator());          //属性参数为int类型使用此估值器

属性参数为float类型:
ValueAnimator anim = ObjectAnimator.ofFloat(控件, "控件属性", 参数...);
anim.setEvaluator(new FloatEvaluator());         //属性参数为float类型使用此估值器

设置颜色时:
ValueAnimator anim = ObjectAnimator.ofArgb(tv, "颜色相关属性", 初始颜色, 结束颜色); //比如backgroundColor,参数为16进制整型来表示颜色
anim.setEvaluator(new ArgbEvaluator());         //设置Color的估值器,设置颜色时用这个

(1)单个动画:
ImageView iv = ...;
ValueAnimator anim = ObjectAnimator.ofFloat(iv, "translationY", 0, 100);   //会从当前位置平滑的移到Y轴为100的位置
anim1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { //监听动画过程
@Override
public void onAnimationUpdate(ValueAnimator animation) { //每播放一帧时触发
}
});

(2)多个动画:

AnimatorSet animSet = new AnimatorSet();
animSet.playTogether(anim1, anim2);              //同时播放
//animSet.playSequentially(anim1, anim2);          //顺序播放
animSet.setDuration(2000);                       //持续时间
animSet.setInterpolator(new AccelerateDecelerateInterpolator()); //设置插值器
animSet.addListener(new Animator.AnimatorListener(){     //监听动画过程

@Override
public void onAnimationStart(Animator animation) {//开始时触发
}

@Override
public void onAnimationEnd(Animator animation) {//结束时触发
}

@Override
public void onAnimationCancel(Animator animation) {//取消时触发
}

@Override
public void onAnimationRepeat(Animator animation) {//重复时触发
}

});
animSet.start();           //开始动画
animSet.cancel();          //取消动画,退出界面时必须取消,以防内存泄露


四、插值器(Interpolator):
TimeInterpolator:
时间插值器,根据时间流逝的百分比计算当前属性值改变的百分比。

LinearInterpolator:
线性插值器,匀速动画。

AccelerateDecelerateInterpolator:
加速减速插值器,开始与结尾慢,中间快。

Decelerate-Interpolator:
减速插值器,动画由快到慢。

五、估值器(TpeEvaluator,类型估值算法,根据当前属性改变的百分比来计算改变后的属性值):
IntEvaluator:
针对整型属性

FloatEvaluator:
针对浮点型属性

ArgbEvaluator:
针对Color属性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: