Animation & Property Animation 使用

http://blog.csdn.net/tianjian4592/article/details/44183525

本篇主要讲Animation 和 Property Animation的使用,最后会讲QQ管家桌面火箭作为例子:

在Android中开发动效有两套框架可以使用,分别为 Animation 和 Property Animation;

相对来说,Animator比Animation要强大太多,两者之间的主要区别在于:

区别一:需要的Anroid API level不一样

Property Animation需要Android API level 11的支持,当然可以使用nineoldandroids.jar进行兼容,而View Animation则是最原始的版本。

区别二:适用范围不一样

Property Animation适用于所有的Object对象,而View Animation则只能应用于View对象。

区别三,实际改变不一样:

Animation:改变的是view的绘制位置,而非实际属性;

Property Animation:改变的是view的实际属性;

如:用两套框架分别对一个button做位移动画,用animation处理之后的点击响应会在原处,而用Property Animation处理后的点击响应会在最终位置处;

 

一:Animation

总的来说可以分为:Tween Animation(补间动画) 和Frame Animation(帧动画)

帧动画(Frame Animation):

帧动画其实就是按照一定的时间间隔进行快速的图片切换,达到视觉上的动画效果,这种动画相对来说缺点较多,比如:

1.根据动画的复杂度需要切多张图,这样就不可避免的增大了包大小

2.由于是多张图,运行时需要加载到内存,那么又会增大运行时的内存大小

所以如果在动效上有别的方案选择,个人不太建议使用帧动画的实现方式,当然有时候不得不用,这时我们可以尽可能的在效果连贯的基础上减少图片张数;

帧动画的实现也相对简单,就举一个例子,但是例子之中有几条帧动画的使用规则,是我以前在使用的过程中遇到问题后总结出来的;

1.在drawable目录下xml中定义如下文件,节点为animation-list,oneshot代表是否执行一次,duration代表每张图对应展示时间:

[html] view plaincopy

  1. <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:oneshot="true">
  3. <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
  4. <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
  5. <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
  6. </animation-list>

2.然后将该drawable设置给对应的imageview

3.在activity中

animDrawable = (AnimationDrawable) imageView.getBackground();

4.在onWindowFocusChanged()中调用:

animDrawable.stop();

animDrawable.start();

如果不这么做,那么在性能比较差的机器上很可能就会出现没有播放的情况,因为只显示出了第一帧,问题在于动画没有和view完成关联,所以不要在onCreate中去调用启动,而需要在onWindowFocusChanged中进行调用;

在极特殊的情况下如果还无法播放,则可以mHandler.postDelay 200 毫秒作为终极杀手锏,当然只要按照我上面的步骤,应该不会出现问题;

好了,帧动画最大的问题是按照上面的步骤开发,接下来看补间动画(Tween Animation)

补间动画(Tween Animation):

Animation下有五个子类:AlphaAnimation(渐变),RotateAnimation(旋转),ScaleAnimation(缩放),TranslateAnimation(位移)

在实现原理上除了AlphaAnimation是动态的去改变view的alpha值,其他三个都是去改变里面的Matrix(矩阵,后面会专门讲);

在Animation框架里,主要的类主要有Animation和Transformation、Interpolator(插值器,后面也会专门讲)

Transformation里面主要对alpha和matrix进行了封装,而改变view的透明度就是改变alpha,移动、旋转、缩放甚至错切则都是改变matrix

Animation里有一个重要的方法applyTransformation,实现自定义Animation也主要是实现这个方法:

以AlphaAnimation为例:

[html] view plaincopy

  1. /**
  2. * Changes the alpha property of the supplied {@link Transformation}
  3. */
  4. @Override
  5. protected void applyTransformation(float interpolatedTime, Transformation t) {
  6. final float alpha = mFromAlpha;
  7. t.setAlpha(alpha + ((mToAlpha - alpha) * interpolatedTime));
  8. }

渐变动画只需要在里面根据当前的interpolatedTime(已经由插值器转换后的值)动态计算出对应的alpha,重新设置到Transformation中即可;

Animation的使用也相对比较简单,可以通过xml配置,也可以通过代码生成:

1.xml配置:

[html] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:shareInterpolator="false" >
  4. <scale>
  5. <!-- 单次运行时间 -->
  6. android:duration="500"
  7. <!-- 运行完成后是否保持结束时的状态 -->
  8. android:fillAfter="true"
  9. <!-- 运行完成后是否回到开始时的状态 -->
  10. android:fillBefore="false"
  11. <!-- 初始时大小,1代表原大小,0代表无 -->
  12. android:fromXScale="1"
  13. android:fromYScale="1"
  14. <!-- 使用的插值器,控制运行过程中的速率 -->
  15. android:interpolator="@android:anim/accelerate_interpolator"
  16. <!-- 相对中心点,50%代表自身中心,50%p代表相对父view的中心 -->
  17. android:pivotX="50%"
  18. android:pivotY="50%"
  19. <!-- 重复的次数,infinite代表永久循环 -->
  20. android:repeatCount="infinite"
  21. <!-- 重复的模式, restart代表重新开始,reverse代表反转-->
  22. android:repeatMode="restart"
  23. <!-- 延迟多久后开始 -->
  24. android:startOffset="100"
  25. <!-- 要到达的缩放比例 -->
  26. android:toXScale="0"
  27. android:toYScale="0" />
  28. </scale>
  29. <translate
  30. android:duration="550"
  31. <!-- 相对当前位置的像素距离 -->
  32. android:fromYDelta="300"
  33. android:interpolator="@android:anim/accelerate_interpolator"
  34. android:toYDelta="0" />
  35. <alpha
  36. android:duration="550"
  37. android:fromAlpha="0"
  38. android:toAlpha="1" />
  39. </set>

当要多个效果同时使用时,则如上使用set标签进行组合,在代码中使用如下:

[html] view plaincopy

  1. Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.app_clean_animation);
  2. view.startAnimation(animation);

2.纯代码生成:

[html] view plaincopy

  1. // false代表里面的子animation不共用一个插值器
  2. AnimationSet animationSet = new AnimationSet(false);
  3. // 从alpha 完全透明变为完全不透明
  4. AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
  5. alphaAnimation.setDuration(500);
  6. alphaAnimation.setFillAfter(true);
  7. // 运行完成后是否回到开始时的状态
  8. alphaAnimation.setFillBefore(false);
  9. alphaAnimation.setInterpolator(new AccelerateInterpolator());
  10. // 重复的次数,infinite代表永久循环
  11. alphaAnimation.setRepeatCount(Animation.INFINITE);
  12. // 重复的模式, restart代表重新开始,reverse代表反转
  13. alphaAnimation.setRepeatMode(Animation.RESTART);
  14. // 给动画设置对应的监听,可以在动画开始、结束或重复执行时做对应操作
  15. alphaAnimation.setAnimationListener(new AnimationListener() {
  16. @Override
  17. public void onAnimationStart(Animation animation) {
  18. //开始时候回调
  19. }
  20. @Override
  21. public void onAnimationRepeat(Animation animation) {
  22. //重复执行时回调
  23. }
  24. @Override
  25. public void onAnimationEnd(Animation animation) {
  26. //一轮结束时回调
  27. }
  28. });
  29. RotateAnimation rotateAnimation = new RotateAnimation(0, 360);
  30. rotateAnimation.setDuration(500);
  31. animationSet.addAnimation(alphaAnimation);
  32. animationSet.addAnimation(rotateAnimation);
  33. view.startAnimation(animationSet);

好了,animation就讲到这里,上面的注释应该比较详尽了,主要是弄清楚其使用方式和使用场景!

二:Property Animation(属性动画)

属性动画,它更改的是对象的实际属性,在View Animation(Tween Animation)中,其改变的是View的绘制效果,真正的View的属性保持不变,比如无论你在对话中如何缩放Button的大小,Button的有效点击区域还是没有应用动画时的区域,其位置与大小都不变。而在Property Animation中,改变的是对象的实际属性,如Button的缩放,Button的位置与大小属性值都改变了。而且Property Animation不止可以应用于View,还可以应用于任何对象。Property Animation只是表示一个值在一段时间内的改变,当值改变时要做什么事情完全是你自己决定的。

在Property Animation中,可以对动画应用以下属性:

1.TimeInterpolator(插值器,和低版本的Interpolator一样):属性值的计算方式,如先快后慢

2.TypeEvaluator:根据属性的开始、结束值与TimeInterpolator计算出的因子计算出当前时间的属性值

3.Repeat Count and behavoir:重复次数与方式,如播放3次、5次、无限循环,可以此动画一直重复,或播放完时再反向播放

4.Animation sets:动画集合,即可以同时对一个对象应用几个动画,这些动画可以同时播放也可以对不同动画设置不同开始偏移

5.Frame refreash delay:多少时间刷新一次,即每隔多少时间计算一次属性值,默认为10ms,最终刷新时间还受系统进程调度与硬件的影响

上面都是些概念,但这些东西不必刻意去记,或去理解插值器这样的比较生涩的概念,我们只需要使用他最实用的部分,并熟悉动画的实现套路;

所以对于属性动画主要带大家熟悉两个类,ValueAnimator和ObjectAnimator,通过这两个类我们平常遇到的动效大部分都能够加以解决;

1.ValueAnimator:

ValueAnimator包含了 Property Animation 动画的所有核心功能,如动画时间,开始、结束属性值,相应时间属性值计算方法等。

在我看来,使用 ValueAnimator 只是为我们创建了一个过程,我们可以用ValueAnimator.ofXXX()进行创建,然后通过各种setXXX()给其设定过程的时间,速率变化效果等,然后通过addUpdateListener()中去拿这个过程中回调回来的中间值,然后使用这些中间值改变view的属性形成动态效果;

上面这句话通过代码表现如下:

比如我们使用 ValueAnimator 在2S内将view横向拉长为2倍,纵向压缩为0:

[html] view plaincopy

  1. // 在2S内将view横向拉长为2倍,纵向压缩为0
  2. // 创建0-1的一个过程,任何复杂的过程都可以采用归一化,然后在addUpdateListener回调里去做自己想要的变化
  3. ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);
  4. // 设置过程的时间为2S
  5. valueAnimator.setDuration(SCALE_ANIM_TIME);
  6. // 设置这个过程是速度不断变快的
  7. valueAnimator.setInterpolator(new AccelerateInterpolator());
  8. // 这个过程中不断执行的回调
  9. valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
  10. @Override
  11. public void onAnimationUpdate(ValueAnimator animation) {
  12. // 不断回调的在0-1这个范围内,经过插值器插值之后的返回值
  13. float value = (Float) animation.getAnimatedValue();
  14. // ViewHelper可直接用于修改view属性
  15. // 将宽在2S内放大一倍
  16. ViewHelper.setScaleX(mTestImage, 1 + value);
  17. // 将高在2S内压缩为0
  18. ViewHelper.setScaleY(mTestImage, 1 - value);
  19. }
  20. });
  21. // AnimatorListenerAdapter是AnimatorListener的空实现,根据需要覆盖的方法自行选择
  22. valueAnimator.addListener(new AnimatorListenerAdapter() {
  23. @Override
  24. public void onAnimationStart(Animator animation) {
  25. super.onAnimationStart(animation);
  26. Toast.makeText(getApplicationContext(), "onAnimationStart", Toast.LENGTH_SHORT)
  27. .show();
  28. }
  29. @Override
  30. public void onAnimationEnd(Animator animation) {
  31. super.onAnimationEnd(animation);
  32. Toast.makeText(getApplicationContext(), "onAnimationEnd", Toast.LENGTH_SHORT)
  33. .show();
  34. }
  35. @Override
  36. public void onAnimationCancel(Animator animation) {
  37. super.onAnimationCancel(animation);
  38. }
  39. @Override
  40. public void onAnimationRepeat(Animator animation) {
  41. super.onAnimationRepeat(animation);
  42. }
  43. });
  44. valueAnimator.start();

动画其实就是在一个时间段内不断去改变view的一些属性值,这些属性值动态变化,不断重绘的过程,也就形成了我们所看到的动效;

那么基于此,我们可以知道这个过程都是通过时间来控制的,时间走过的比例肯定在 0-1 之间,如果我们直接用这个走过的时间比例去算当前属性值,那么整个过程则是匀速(线性)的;

那么在这个基础上,我们想我们的过程是非线性的,我们该怎么办呢,那么只需要对这个时间比例加以加工,具体请看下图:

横轴就是经过的时间比例,肯定是匀速的从0-1,纵轴则是时间比例经过加工后的插值,这个对应过程则是Interpolator(插值器)对应的过程;

减速线则对应DecelerateInterpolater,因为它的斜率越来越平,所以瞬时速度越来越小,则形成了减速效果;

其他的效果类似,目前android里提供的插值器有如下一些:

  • AccelerateInterpolator          加速,开始时慢中间加速
  • DecelerateInterpolator         减速,开始时快然后减速
  • AccelerateDecelerateInterolator    先加速后减速,开始结束时慢,中间加速
  • AnticipateInterpolator        反向 ,先向相反方向改变一段再加速播放
  • AnticipateOvershootInterpolator    反向加回弹,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动至目的值
  • BounceInterpolator         跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
  • CycleIinterpolator         循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI * input)
  • LinearInterpolator         线性,线性均匀改变
  • OvershottInterpolator        回弹,最后超出目的值然后缓慢改变到目的值
  • TimeInterpolator           一个接口,允许你自定义interpolator,以上几个都是实现了这个接口

其实想实现对应的效果,其实是找一条曲线对对应条件进行模拟,然后根据曲线函数,和X值,得出每个时间点上对应的Y值(插值),这也就是插值器原理;

2.ObjectAnimator

我们同样还是实现在2S内将view横向拉长为2倍,纵向压缩为0:

[html] view plaincopy

  1. AnimatorSet animatorSet = new AnimatorSet();
  2. // 将view在x方向上从原大小放大2倍
  3. ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(mTestImage, "scaleX", 1, 2);
  4. scaleXAnimator.setDuration(SCALE_ANIM_TIME);
  5. // 将view在y方向上从原大小压缩为0
  6. ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(mTestImage, "scaleY", 1, 0);
  7. scaleYAnimator.setDuration(SCALE_ANIM_TIME);
  8. // 设置加速模式
  9. animatorSet.setInterpolator(new AccelerateInterpolator());
  10. // 设置回调,当然也可以设置在单独的animator上,eg:scaleXAnimator
  11. animatorSet.addListener(new AnimatorListenerAdapter() {
  12. @Override
  13. public void onAnimationStart(Animator animation) {
  14. super.onAnimationStart(animation);
  15. Toast.makeText(getApplicationContext(), "onAnimationStart", Toast.LENGTH_SHORT)
  16. .show();
  17. }
  18. @Override
  19. public void onAnimationEnd(Animator animation) {
  20. super.onAnimationEnd(animation);
  21. Toast.makeText(getApplicationContext(), "onAnimationEnd", Toast.LENGTH_SHORT)
  22. .show();
  23. }
  24. @Override
  25. public void onAnimationCancel(Animator animation) {
  26. super.onAnimationCancel(animation);
  27. }
  28. @Override
  29. public void onAnimationRepeat(Animator animation) {
  30. super.onAnimationRepeat(animation);
  31. }
  32. });
  33. animatorSet.playTogether(scaleXAnimator, scaleYAnimator);
  34. animatorSet.start();

ObjectAnimator 是ValueAnimator 的子类,可以直接改变Object的属性,目前可供改变的属性主要有:

  • translationX,translationY           View相对于原始位置的偏移量
  • rotation,rotationX,rotationY       旋转,rotation用于2D旋转角度,3D中用到后两个
  • scaleX,scaleY                           缩放比
  • x,y                                             View的最终坐标,是View的left,top位置加上translationX,translationY
  • alpha                                         透明度

关于Animator主要分享这两个类,其他的比如 PropertyValuesHolder 大家可以自己去看;

QQ管家桌面悬浮窗动画

分析:

1.浮在桌面上的小圆泡可以盖在所有应用之上,并且可以独立操作,不影响其他操作,需要使用WindowManager.addView ;

2.拖动的时候变成小火箭,需要手势处理 onTouch;

3.拖动到底部区域的时候震动,需要对拖动到的位置做时候判断;

4.放手时位置如果在底座区,则发射火箭,否则变成小圆回到边界;

5.火箭喷火效果,可以通过两张图帧动画实现,也可以采用属性动画实现(通过看QQ管家的图,应该是采用的帧动画方式);

6.底部的底座闪动效果也是三张图的帧动画;

有了以上分析,我们来实现具体功能:

首先通过反编译拿到对应的资源文件,编译命令: ./apktool d XXX.apk

根据它的效果,我们首先完成手拖动圆环变成火箭,可随意在界面上拖动部分:

[html] view plaincopy

  1. // 使用WindowManager添加window需要android.permission.SYSTEM_ALERT_WINDOW权限
  2. mWindowManager = (WindowManager) this.getSystemService(WINDOW_SERVICE);
  3. mIconLayoutParams = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT,
  4. LayoutParams.WRAP_CONTENT, LayoutParams.TYPE_SYSTEM_ALERT,
  5. LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSPARENT);
  6. mIconLayoutParams.gravity = Gravity.LEFT | Gravity.TOP;

[html] view plaincopy

  1. private void moveIconContent(float x, float y) {
  2. mIconLayoutParams.x = (int) x;
  3. // y值要减去通知栏的高度
  4. mIconLayoutParams.y = (int) y - mStatusBarHeight;
  5. fixLayoutParams(mIconLayoutParams);
  6. mWindowManager.updateViewLayout(mIconContent, mIconLayoutParams);
  7. }

放手时需要缓慢移动到边缘部分,这里我们使用ValueAnimator创建一个过程,在这个过程里我们动态去改变LayoutParams的x值:

[html] view plaincopy

  1. float toX = 0;
  2. if (rawX < totalWidth / 2) {
  3. toX = 0;
  4. } else {
  5. toX = totalWidth - view.getWidth() / 2;
  6. }
  7. // 创建从当前x到目标x的过程
  8. ValueAnimator mSlideToBoundaryAnim = ValueAnimator.ofFloat(rawX, toX);
  9. // 设置动画运行时间
  10. mSlideToBoundaryAnim.setDuration(SLIDE_TO_BOUNDARY_TIME);
  11. // 减速效果,为了贴边的时候显得柔和
  12. mSlideToBoundaryAnim.setInterpolator(new DecelerateInterpolator());
  13. mSlideToBoundaryAnim.addUpdateListener(new AnimatorUpdateListener() {
  14. @Override
  15. public void onAnimationUpdate(ValueAnimator valueAnimator) {
  16. // 拿出当前时刻回调的值
  17. float currentValue = (Float) valueAnimator.getAnimatedValue();
  18. // 将值不断设给浮动小火箭的layoutParams,从而形成动效
  19. mIconLayoutParams.x = (int) currentValue;
  20. fixLayoutParams(mIconLayoutParams);
  21. // 改变WindowManager添加的view的位置
  22. mWindowManager.updateViewLayout(mIconContent, mIconLayoutParams);
  23. }
  24. });
  25. mSlideToBoundaryAnim.addListener(new AnimatorListenerAdapter() {
  26. @Override
  27. public void onAnimationEnd(Animator animation) {
  28. // 在动画结束的时候把火箭重新设置回之前的小icon
  29. // 当然可以给两个icon加上更加柔和的切换动画,我这里就不加了
  30. mIconImage.setImageDrawable(mCircleDrawable);
  31. }
  32. });
  33. mSlideToBoundaryAnim.start();

然后添加底部界面,界面就一个底座和三张闪动的光图,闪动的光图采用前面说的帧动画实现,然后根据拖动的位置,判断是否需要震动,并调节震动的节奏:

[html] view plaincopy

  1. // 如果在发射区,则震动
  2. if (isInLaunchSpace(event)) {
  3. log("---In Launch Space");
  4. mVibrator.vibrate(VIBRATOR_PATTERN, 0);
  5. } else {
  6. // 否则取消震动
  7. log("---not In Launch Space");
  8. if (mVibrator != null)
  9. mVibrator.cancel();
  10. }

放手时,如果在发射区,则要发射火箭,主要以下步骤:

1.底座相关消失

2.底部烟雾出现

3.火箭向上飞,向上飞的时候烟雾线往上拉出

4.移除整个火箭页面

[html] view plaincopy

  1. mRocketPad.setVisibility(View.INVISIBLE);
  2. mRocketFire.setVisibility(View.INVISIBLE);
  3. Animation alphaIn = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha_in);
  4. alphaIn.setAnimationListener(new AnimationListenerAdapter() {
  5. @Override
  6. public void onAnimationEnd(Animation animation) {
  7. // 底部烟雾出现完成,飞机出现并执行火箭往上飞
  8. mBottomRocket.setVisibility(View.VISIBLE);
  9. ObjectAnimator transY = ObjectAnimator.ofFloat(mBottomRocket, "translationY",
  10. 0, -mScreenHeight);
  11. transY.setDuration(1000);
  12. transY.setInterpolator(new DecelerateInterpolator());
  13. // 向上飞的时候烟雾线往上拉出
  14. ObjectAnimator smokeTopAnim = ObjectAnimator.ofFloat(mSmoketop, "scaleY", 0, 1);
  15. // 设置缩放基准点为
  16. ViewHelper.setPivotX(mSmoketop, mSmoketop.getMeasuredWidth() * 0.5f);
  17. ViewHelper.setPivotY(mSmoketop, mSmoketop.getMeasuredHeight());
  18. smokeTopAnim.setDuration(700);
  19. ObjectAnimator smokeAlphaAnim = ObjectAnimator.ofFloat(mSmoketop, "alpha", 0, 1);
  20. smokeTopAnim.setInterpolator(new DecelerateInterpolator());
  21. smokeTopAnim.addListener(new AnimatorListenerAdapter() {
  22. @Override
  23. public void onAnimationStart(Animator animation) {
  24. mSmoketop.setVisibility(View.VISIBLE);
  25. }
  26. @Override
  27. public void onAnimationEnd(Animator animation) {
  28. // 移除火箭页面,添加icon
  29. if (mIsRocketContentAdded) {
  30. mWindowManager.removeView(mRocketContent);
  31. mIsRocketContentAdded = false;
  32. }
  33. if (!mIsIconContentAdded) {
  34. if (mIconLayoutParams.x < mScreenWidth / 2) {
  35. mIconLayoutParams.x = 0;
  36. } else {
  37. mIconLayoutParams.x = mScreenWidth - mIconWidth / 2;
  38. }
  39. mIconImage.setImageDrawable(mCircleDrawable);
  40. mWindowManager.addView(mIconContent, mIconLayoutParams);
  41. mIsIconContentAdded = true;
  42. }
  43. // 将view的显示状态重置
  44. mSmokePad.setVisibility(View.INVISIBLE);
  45. mSmoketop.setVisibility(View.INVISIBLE);
  46. mRocketPad.setVisibility(View.VISIBLE);
  47. mRocketFire.setVisibility(View.VISIBLE);
  48. }
  49. });
  50. AnimatorSet animatorSet = new AnimatorSet();
  51. // 同时执行上面两个效果
  52. animatorSet.playTogether(transY, smokeTopAnim, smokeAlphaAnim);
  53. animatorSet.start();
  54. }
  55. });
  56. mSmokePad.setVisibility(View.VISIBLE);
  57. mSmokePad.startAnimation(alphaIn);

好了,效果就说这么多,往往做效果最重要的是理清思路,弄清效果的衔接和前后关系,剩下的就是和UE配合,耐心的调节奏和感觉了;

源码下载地址:http://download.csdn.net/download/tianjian4592/8496705

时间: 2024-10-28 07:28:50

Animation & Property Animation 使用的相关文章

Android Property Animation

Property Animation介绍: 出生在3.0,是利用了View所拥有的属性,进行一系列的操作.比如一个View有什么样的setAbc的属性,那么理论上就可以设置它. 它不仅改变View的绘制,也改变了View的属性:而Tween Animation 只改变View的绘制. ValueAnimator 为动画的基类,它有一个子类ObjectAnimator.需要Interpolator和TypeEvaluator来计算属性值. Interpolator 时间插入器,动画的运动速率,参见

属性动画总结(Property Animation)

一.概述 属性动画可以作用在View的属性上,对属性进行修改,而且不要求对应的属性一定是有显示效果的. 二.属性动画的实现方式 1.基础的类Animator Animator是一个抽象类,是属性动画的基础类.不直接使用该类. 2.ObjectAnimator,继承自ValueAnimator 使用起来比较方便的是ObjectAnimator,可以使用ObjectAnimator直接指定需要修改的view,要修改的属性,值的变化范围. ObjectAnimator.ofFloat(view, "r

Android 属性动画(Property Animation) 完全解析 (上)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38067475 1.概述 Android提供了几种动画类型:View Animation .Drawable Animation .Property Animation .View Animation相当简单,不过只能支持简单的缩放.平移.旋转.透明度基本的动画,且有一定的局限性.比如:你希望View有一个颜色的切换动画:你希望可以使用3D旋转动画:你希望当动画停止时,View的

Android UI开发第四十三篇——使用Property Animation实现墨迹天气3.0引导界面及动画实现

前面写过<墨迹天气3.0引导界面及动画实现>,里面完美实现了动画效果,那一篇文章使用的View Animation,这一篇文章使用的Property Animation实现.Property Animation是Android3.0以后新增的动画库. 这篇文章的源码以及效果在github. 实现墨迹天气向上滑动的viewpager使用的开源库ViewPager-Android.ViewPager-Android开源库设置app:orientation定义滑动方向. 墨迹天气引导界面共有4个视图

Android(java)学习笔记263:Android下的属性动画(Property Animation)

1. 属性动画(Property Animation)引入: 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(frame-by-frame animation)和补间动画(tweened animation). 逐帧动画的工作原理很简单,其实就是将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似于动画片的工作原理. 补间动画则是可以对View进行一系列的动画操作,包括淡入淡出.缩放.平移.

Android 属性动画(Property Animation) 完全解析 (下)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38092093 上一篇Android 属性动画(Property Animation) 完全解析 (上)已经基本展示了属性动画的核心用法: ObjectAnimator实现动画,ValueAnimator实现动画,AnimatorSet的使用等~ 当然了属性动画还有一部分的知识点,也能做出很不错的效果,将在本篇博客为您展示~ 1.如何使用xml文件来创建属性动画 大家肯定都清楚,

【转】Android 属性动画(Property Animation) 完全解析 (上)

http://blog.csdn.net/lmj623565791/article/details/38067475 1.概述 Android提供了几种动画类型:View Animation .Drawable Animation .Property Animation .View Animation相当简单,不过只能支持简单的缩放.平移.旋转.透明度基本的动画,且有一定的局限性.比如:你希望View有一个颜色的切换动画:你希望可以使用3D旋转动画:你希望当动画停止时,View的位置就是当前的位

[经验总结]图解property animation

思维导图画了一下android property animation以及其与之前的view animation的区别,以此来帮助自己理解 见图片

Android动画效果之初识Property Animation(属性动画)(三)

前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Android动画效果之Frame Animation(逐帧动画)(二),其实总结前两个的根本目的就是为了学习今天的主角Property Animation(属性动画).其实在Android最早期只提供了前两种动画方式,在Android 3.0才引入了属性动画,谷歌为何要引入属性动画呢?今天我们来总结学习一