Android:几种动画的使用(Tween动画、Frame动画、属性动画)
2016-11-17 14:56
513 查看
一、Tween动画:
1.平移动画(TranslateAnimation):
xml方式(文件放在res/anim目录下):
代码方式:
2.缩放动画(ScaleAnimation):
xml方式(文件放在res/anim目录下):
代码方式:
3.旋转动画(RotateAnimation):
xml方式(文件放在res/anim目录下):
代码方式:
4.透明度动画(AlphaAnimation):
xml方式(文件放在res/anim目录下):
代码方式:
5.执行动画:
6.ListView动画效果(layoutAnimation的使用):
(1)定义动画文件(res/anim/目录下):
anim_list_item.xml文件:
(2)给ListView加上android:layoutAnimation属性
布局方式:
或者用代码方式:
7.Activity切换动画效果:
push_right_to_left.xml:
push.xml:
push_left_to_right.xml:
二、Frame动画
(1)在res/anim目录下定义progress.xml:
(2)将动画xml作为View的背景:
(3)播放动画:
三、属性动画:
属性动画原理:多次调用(类似Timer定时调用)传入参数的set方法(比如translationY,就是不停的调用View的setTranslationY方法实现延Y轴平移),每次调用时传入的参数值都是改变后的值。
传入的控件属性必须set方法,如果只传一个参数,还需要get方法用于获取原值
属性参数为int类型:
属性参数为float类型:
设置颜色时:
(1)单个动画:
(2)多个动画:
四、插值器(Interpolator):
TimeInterpolator:
时间插值器,根据时间流逝的百分比计算当前属性值改变的百分比。
LinearInterpolator:
线性插值器,匀速动画。
AccelerateDecelerateInterpolator:
加速减速插值器,开始与结尾慢,中间快。
Decelerate-Interpolator:
减速插值器,动画由快到慢。
五、估值器(TpeEvaluator,类型估值算法,根据当前属性改变的百分比来计算改变后的属性值):
IntEvaluator:
针对整型属性
FloatEvaluator:
针对浮点型属性
ArgbEvaluator:
针对Color属性
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属性
相关文章推荐
- Android L(5.0)源码之图形与图像处理之动画——Frame、Tween、属性动画、SurfaceView
- Android动画主要包含补间动画(Tween)View Animation、帧动画(Frame)Drawable Animation、以及属性动画Property Animation
- Android中Tween动画和Frame动画实例
- 【Android】两种动画介绍(Tween动画、Frame动画)
- Android Tween和Frame 动画
- Android中属性动画Property Animation使用示例(三)
- Android使用属性动画ValueAnimator动态改变SurfaceView的背景颜色
- android tween、frame动画
- 使用android frame动画定义自己的ProgressBar
- Android Tween和Frame 动画
- Java乔晓松-android中的Tween动画的使用
- Android中属性动画Property Animation使用示例(三)
- 【Android2D游戏开发十四】(未完待续)手把手教你在SurfaceView中照样使用Android 动画—Tween Animation!
- Android常用动画Frame-By-Frame Animations的使用
- Android游戏开发之使用AnimationDrable实现Frame动画(三十一)
- 关于 android Tween动画 和 frame动画的简单学习
- 【Android】两种动画介绍(Tween动画、Frame动画)
- 【Android】两种动画介绍(Tween动画、Frame动画)
- Android中属性动画Property Animation使用示例(四)
- Android常用动画Frame-By-Frame Animations的使用