Android三种动画介绍(property动画,Tween动画、Frame动画)

 

Animation

Property Animation
(可以对view或non-view的任意属性变化来形成动画)
(对于view来说只是一二个属性的动画可以用ObjectAnimator,但是如果是多个属性同时动画或者为了使用方便可以使用ViewPropertyAnimator)
http://blog.csdn.net/xushuaic/article/details/40424379
http://blog.csdn.net/jjwwmlp456/article/details/38518657
Introduced in Android 3.0 (API level 11), the property animation system lets you animate properties of any object, including ones that are not rendered to the screen. The system is extensible and lets you animate properties of custom types as well.
View Animation
(补间动画-Tween动画 是一种老式系统动画,只是简单的位移,缩放,透明变化等等)
View Animation is the older system and can only be used for Views. It is relatively easy to setup and offers enough capabilities to meet many application’s needs.
Drawable Animation
(帧动画-frame动画,是利用多张图片连续播放形成动画)
Drawable animation involves displaying Drawable resources one after another, like a roll of film. This method of animation is useful if you want to animate things that are easier to represent with Drawable resources, such as a progression of bitmaps.

 

 

http://developer.android.com/guide/topics/graphics/view-animation.html

Android中的动画类型有两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。下面将一一详细介绍:

本博客参考自网络,结合自己一点理解,实为学习之用,不为其他目的。

一,Tween动画

又称“补间动画”、“中间动画”,最早接触Tween类是在学习Flash时候,使用ActionScript做动画的时候,使用过类Tween。

Tween动画主要的功能是在绘制动画前设置动画绘制的轨迹,包括时间, 位置 ,等等。但是Tween动画的缺点是它只能设置起始点与结束点的两帧,中间过程全部由系统帮我们完成。所以在帧数比较多的游戏开发中是不太会用到它的。
Tween一共提供了4中动画的效果

Scale:缩放动画
Rotate:旋转动画
Translate:移动动画
Alpha::透明渐变动画

Tween与Frame动画类似都需要在res\anim路径下创建动画的 布局文件

1)Scale动画

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.view.View;
  4. import android.view.View.OnClickListener;
  5. import android.view.animation.Animation;
  6. import android.view.animation.AnimationUtils;
  7. import android.widget.Button;
  8. import android.widget.ImageView;
  9. public class ScaleActivity extends Activity {
  10.     Button mButton0 = null;//缩小动画
  11.     Button mButton1 = null;//放大动画
  12.     ImageView mImageView = null; //显示动画
  13.     Animation mLitteAnimation = null; //缩小动画
  14.     Animation mBigAnimation = null; //放大动画
  15.     @Override
  16.     public void onCreate(Bundle savedInstanceState) {
  17.     super.onCreate(savedInstanceState);
  18.     setContentView(R.layout.scale);
  19.     mImageView = (ImageView)findViewById(R.id.imageView);
  20.     /**加载缩小与放大动画**/
  21.     mLitteAnimation = AnimationUtils.loadAnimation(this, R.anim.scalelitte);
  22.     mBigAnimation = AnimationUtils.loadAnimation(this, R.anim.scalebig);
  23.     mButton0 = (Button)findViewById(R.id.button0);
  24.     mButton0.setOnClickListener(new OnClickListener() {
  25.         @Override
  26.         public void onClick(View arg0) {
  27.         /**播放缩小动画**/
  28.         mImageView.startAnimation(mLitteAnimation);
  29.         }
  30.     });
  31.     mButton1 = (Button)findViewById(R.id.button1);
  32.     mButton1.setOnClickListener(new OnClickListener() {
  33.         @Override
  34.         public void onClick(View arg0) {
  35.         /**播放放大动画**/
  36.         mImageView.startAnimation(mBigAnimation);
  37.         }
  38.     });
  39.     }
  40. }
  1. <scale>标签为缩放节点
  2. android:fromXscale=“1.0” 表示开始时X轴缩放比例为 1.0 (原图大小 * 1.0 为原图大小)
  3. android:toXscale=“0.0”   表示结束时X轴缩放比例为0.0(原图大小 *0.0 为缩小到看不见)
  4. android:fromYscale=“1.0” 表示开始时Y轴缩放比例为 1.0 (原图大小 * 1.0 为原图大小)
  5. android:toYscale=“0.0”   表示结束时Y轴缩放比例为0.0(原图大小 *0.0 为缩小的看不到了)
  6. android:pivotX=“50%”     X轴缩放的位置为中心点
  7. android:pivotY=“50%”     Y轴缩放的位置为中心点
  8. android:duration=“2000”  动画播放时间 这里是2000毫秒也就是2秒

/anim/scalelitte.xml

  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <scale
  3.       xmlns:android=“http://schemas.android.com/apk/res/android”
  4.       android:fromXScale=“0.0”
  5.       android:toXScale=“1.0”
  6.       android:fromYScale=“0.0”
  7.       android:toYScale=“1.0”
  8.       android:pivotX=“50%”
  9.       android:pivotY=“50%”
  10.       android:duration=“2000”>
  11. </scale>

/anim/scalebig.xml

  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <scale xmlns:android=“http://schemas.android.com/apk/res/android”
  3.             android:fromXScale=“1.0”
  4.             android:toXScale=“0.0”
  5.             android:fromYScale=“1.0”
  6.             android:toYScale=“0.0”
  7.             android:pivotX=“50%”
  8.             android:pivotY=“50%”
  9.             android:duration=“2000”>
  10. </scale>

如果在代码中,加载动画,而不用xml配置动画

  1. mLitteAnimation =  new ScaleAnimation(0.0f, 1.0f, 0.0f,  1.0f,
  2.                   Animation.RELATIVE_TO_SELF, 0.5f,
  3.                   Animation.RELATIVE_TO_SELF, 0.5f);
  4.               mLitteAnimation.setDuration(2000);

2)Rotate旋转动画


  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.view.View;
  4. import android.view.View.OnClickListener;
  5. import android.view.animation.Animation;
  6. import android.view.animation.AnimationUtils;
  7. import android.widget.Button;
  8. import android.widget.ImageView;
  9. public class RotateActivity extends Activity {
  10.     /**向左旋转动画按钮**/
  11.     Button mButton0 = null;
  12.     /**向右旋转动画按钮**/
  13.     Button mButton1 = null;
  14.     /**显示动画的ImageView**/
  15.     ImageView mImageView = null;
  16.     /**向左旋转动画**/
  17.     Animation mLeftAnimation = null;
  18.     /**向右旋转动画**/
  19.     Animation mRightAnimation = null;
  20.     @Override
  21.     public void onCreate(Bundle savedInstanceState) {
  22.     super.onCreate(savedInstanceState);
  23.     setContentView(R.layout.retate);
  24.     /**拿到ImageView对象**/
  25.     mImageView = (ImageView)findViewById(R.id.imageView);
  26.     /**加载向左与向右旋转动画**/
  27.     mLeftAnimation = AnimationUtils.loadAnimation(this, R.anim.retateleft);
  28.     mRightAnimation = AnimationUtils.loadAnimation(this, R.anim.retateright);
  29.     mButton0 = (Button)findViewById(R.id.button0);
  30.     mButton0.setOnClickListener(new OnClickListener() {
  31.         @Override
  32.         public void onClick(View arg0) {
  33.         /**播放向左旋转动画**/
  34.         mImageView.startAnimation(mLeftAnimation);
  35.         }
  36.     });
  37.     mButton1 = (Button)findViewById(R.id.button1);
  38.     mButton1.setOnClickListener(new OnClickListener() {
  39.         @Override
  40.         public void onClick(View arg0) {
  41.         /**播放向右旋转动画**/
  42.         mImageView.startAnimation(mRightAnimation);
  43.         }
  44.     });
  45.     }
  46. }
  1. <rotate>标签为旋转节点
  2. Tween一共为我们提供了3种动画渲染模式。
  3. android:interpolator=“@android:anim/accelerate_interpolator” 设置动画渲染器为加速动画(动画播放中越来越快)
  4. android:interpolator=“@android:anim/decelerate_interpolator” 设置动画渲染器为减速动画(动画播放中越来越慢)
  5. android:interpolator=“@android:anim/accelerate_decelerate_interpolator” 设置动画渲染器为先加速在减速(开始速度最快 逐渐减慢)
  6. 如果不写的话 默认为匀速运动
  7. android:fromDegrees=“+360”设置动画开始的角度
  8. android:toDegrees=“0”设置动画结束的角度
  9. 这个动画布局设置动画将向左做360度旋转加速运动。

/anim/retateleft.xml

  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <rotate xmlns:android=“http://schemas.android.com/apk/res/android”
  3.         android:interpolator=“@android:anim/accelerate_interpolator”
  4.         android:fromDegrees=“+360”
  5.         android:toDegrees=“0”
  6.         android:pivotX=“50%”
  7.         android:pivotY=“50%”
  8.         android:duration=“2000”
  9. />

/anim/retateright.xml

  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <rotate  xmlns:android=“http://schemas.android.com/apk/res/android”
  3.         android:interpolator=“@android:anim/decelerate_interpolator”
  4.         android:fromDegrees=“0”
  5.         android:toDegrees=“+360”
  6.         android:pivotX=“50%”
  7.         android:pivotY=“50%”
  8.         android:duration=“2000”
  9. />

如果在代码中加载动画,而不用xml配置,代码如下

  1. mLeftAnimation = new RotateAnimation(360.0f, 0.0f,
  2.         Animation.RELATIVE_TO_SELF, 0.5f,
  3.         Animation.RELATIVE_TO_SELF, 0.5f);
  4.              mLeftAnimation.setDuration(2000);

3)Translate移动动画

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.view.animation.Animation;
  4. import android.view.animation.AnimationUtils;
  5. import android.widget.ImageView;
  6. public class TranslateActivity extends Activity {
  7.     /**显示动画的ImageView**/
  8.     ImageView mImageView = null;
  9.     /**移动动画**/
  10.     Animation mAnimation = null;
  11.     @Override
  12.     public void onCreate(Bundle savedInstanceState) {
  13.     super.onCreate(savedInstanceState);
  14.     setContentView(R.layout.translate);
  15.     /**拿到ImageView对象**/
  16.     mImageView = (ImageView)findViewById(R.id.imageView);
  17.     /**加载移动动画**/
  18.     mAnimation = AnimationUtils.loadAnimation(this, R.anim.translate);
  19.     /**播放移动动画**/
  20.     mImageView.startAnimation(mAnimation);
  21.     }
  22. }

/layout/translate.xml

  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
  3.     android:orientation=“vertical”
  4.     android:layout_width=“fill_parent”
  5.     android:layout_height=“fill_parent”
  6.     >
  7.   <ImageView
  8.    android:id=“@+id/imageView”
  9.    android:src=“@drawable/images”
  10.    android:layout_width=“wrap_content”
  11.    android:layout_height=“wrap_content”
  12.  />
  13. </LinearLayout>

/anim/translate.xml

  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <translate  xmlns:android=“http://schemas.android.com/apk/res/android”
  3.     android:fromXDelta=“0”
  4.     android:toXDelta=“320”
  5.     android:fromYDelta=“0”
  6.     android:toYDelta=“480”
  7.     android:duration=“2000”
  8.     android:repeatCount=“infinite”
  9. />

说明:

  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <translate  xmlns:android=“http://schemas.android.com/apk/res/android”
  3.     android:fromXDelta=“0”
  4.     android:toXDelta=“320”
  5.     android:fromYDelta=“0”
  6.     android:toYDelta=“480”
  7.     android:duration=“2000”
  8.     android:repeatCount=“infinite”
  9. />

代码中加载动画:

  1. mAnimation = new TranslateAnimation(0, 320, 0, 480);
  2. mAnimation.setDuration(2000);

4 )Alpha:透明渐变动画

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.view.animation.Animation;
  4. import android.view.animation.AnimationUtils;
  5. import android.widget.ImageView;
  6. public class AlphaActivity extends Activity {
  7.     /**显示动画的ImageView**/
  8.     ImageView mImageView = null;
  9.     /**透明动画**/
  10.     Animation mAnimation = null;
  11.     @Override
  12.     public void onCreate(Bundle savedInstanceState) {
  13.     super.onCreate(savedInstanceState);
  14.     setContentView(R.layout.translate);
  15.     /**拿到ImageView对象**/
  16.     mImageView = (ImageView)findViewById(R.id.imageView);
  17.     /**加载透明动画**/
  18.     mAnimation = AnimationUtils.loadAnimation(this, R.anim.alpha);
  19.     /**播放透明动画**/
  20.     mImageView.startAnimation(mAnimation);
  21.     }
  22. }

/anim/alpha.xml

  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <alpha  xmlns:android=“http://schemas.android.com/apk/res/android”
  3.     android:fromAlpha=“1.0”
  4.     android:toAlpha=“0.0”
  5.     android:repeatCount=“infinite”
  6.     android:duration=“2000”>
  7. </alpha>

说明:

  1. <alpha>标签为alpha透明度节点
  2. android:fromAlpha=“1.0” 设置动画起始透明度为1.0 表示完全不透明
  3. android:toAlpha=“0.0”设置动画结束透明度为0.0 表示完全透明
  4. 也就是说alpha的取值范围为0.0 – 1.0 之间

手动加载动画:

  1. mAnimation = new AlphaAnimation(1.0f, 0.0f);
  2. mAnimation.setDuration(2000);

5)综合动画

可以将上面介绍的4种动画设置在一起同时进行播放,那么就须要使用<set>标签将所有须要播放的动画放在一起。

这个动画布局设置动画同时播放移动、渐变、旋转。

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. import android.view.animation.Animation;
  4. import android.view.animation.AnimationUtils;
  5. import android.widget.ImageView;
  6. public class AllActivity extends Activity {
  7.     ImageView mImageView = null;
  8.     Animation mAnimation = null;
  9.     @Override
  10.     public void onCreate(Bundle savedInstanceState) {
  11.     super.onCreate(savedInstanceState);
  12.     setContentView(R.layout.translate);
  13.     mImageView = (ImageView)findViewById(R.id.imageView);
  14.     mAnimation = AnimationUtils.loadAnimation(this, R.anim.all);
  15.     mImageView.startAnimation(mAnimation);
  16.     }
  17. }

/anim/all.xml

  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <set xmlns:android=“http://schemas.android.com/apk/res/android”>
  3.     <rotate
  4.         android:interpolator=“@android:anim/accelerate_interpolator”
  5.         android:fromDegrees=“+360”
  6.         android:toDegrees=“0”
  7.         android:pivotX=“50%”
  8.         android:pivotY=“50%”
  9.         android:duration=“2000”
  10.         android:repeatCount=“infinite”
  11.     />
  12.     <alpha  android:fromAlpha=“1.0”
  13.     android:toAlpha=“0.0”
  14.     android:repeatCount=“infinite”
  15.     android:duration=“2000”>
  16.     </alpha>
  17.  <translate
  18.     android:fromXDelta=“0”
  19.     android:toXDelta=“320”
  20.     android:fromYDelta=“0”
  21.     android:toYDelta=“480”
  22.     android:duration=“2000”
  23.     android:repeatCount=“infinite”
  24. />
  25. </set>

二,AnimationDrable实现Frame动画(设计游戏专用,嘎嘎嘎)感谢宣教主分享

  1. import android.app.Activity;
  2. import android.graphics.drawable.AnimationDrawable;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. import android.widget.ImageView;
  9. import android.widget.RadioButton;
  10. import android.widget.RadioGroup;
  11. import android.widget.SeekBar;
  12. import android.widget.SeekBar.OnSeekBarChangeListener;
  13. public class SimpleActivity extends Activity {
  14.     /**播放动画按钮**/
  15.     Button button0 = null;
  16.     /**停止动画按钮**/
  17.     Button button1 = null;
  18.     /**设置动画循环选择框**/
  19.     RadioButton radioButton0null;
  20.     RadioButton radioButton1null;
  21.     RadioGroup  radioGroup = null;
  22.     /**拖动图片修改Alpha值**/
  23.     SeekBar seekbar = null;
  24.     /**绘制动画View**/
  25.     ImageView imageView = null;
  26.     /**绘制动画对象**/
  27.     AnimationDrawable animationDrawable = null;
  28.     @Override
  29.     public void onCreate(Bundle savedInstanceState) {
  30.     super.onCreate(savedInstanceState);
  31.     setContentView(R.layout.simple);
  32.     /**拿到ImageView对象**/
  33.     imageView = (ImageView)findViewById(R.id.imageView);
  34.     /**通过ImageView对象拿到背景显示的AnimationDrawable**/
  35.     animationDrawable = (AnimationDrawable) imageView.getBackground();
  36.     /**开始播放动画**/
  37.     button0 = (Button)findViewById(R.id.button0);
  38.     button0.setOnClickListener(new OnClickListener() {
  39.         @Override
  40.         public void onClick(View arg0) {
  41.         /**播放动画**/
  42.         if(!animationDrawable.isRunning()) {
  43.             animationDrawable.start();
  44.         }
  45.         }
  46.     });
  47.     /**停止播放动画**/
  48.     button1 = (Button)findViewById(R.id.button1);
  49.     button1.setOnClickListener(new OnClickListener() {
  50.         @Override
  51.         public void onClick(View arg0) {
  52.         /**停止动画**/
  53.         if(animationDrawable.isRunning()) {
  54.             animationDrawable.stop();
  55.         }
  56.         }
  57.     });
  58.     /**单次播放**/
  59.     radioButton0 = (RadioButton)findViewById(R.id.checkbox0);
  60.     /**循环播放**/
  61.     radioButton1 = (RadioButton)findViewById(R.id.checkbox1);
  62.     /**单选列表组**/
  63.     radioGroup = (RadioGroup)findViewById(R.id.radiogroup);
  64.     radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
  65.         @Override
  66.         public void onCheckedChanged(RadioGroup radioGroup, int checkID) {
  67.         if(checkID == radioButton0.getId()) {
  68.             //设置单次播放
  69.             animationDrawable.setOneShot(true);
  70.         }else if (checkID == radioButton1.getId()) {
  71.             //设置循环播放
  72.             animationDrawable.setOneShot(false);
  73.         }
  74.         //发生改变后让动画重新播放
  75.         animationDrawable.stop();
  76.         animationDrawable.start();
  77.         }
  78.     });
  79.     /**监听的进度条修改透明度**/
  80.     seekbar = (SeekBar)findViewById(R.id.seekBar);
  81.     seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
  82.         @Override
  83.         public void onStopTrackingTouch(SeekBar seekBar) {
  84.         }
  85.         @Override
  86.         public void onStartTrackingTouch(SeekBar seekBar) {
  87.         }
  88.         @Override
  89.         public void onProgressChanged(SeekBar seekBar, int progress, boolean frameTouch) {
  90.         /**设置动画Alpha值**/
  91.         animationDrawable.setAlpha(progress);
  92.         /**通知imageView 刷新屏幕**/
  93.         imageView.postInvalidate();
  94.         }
  95.     });
  96.     }
  97. }

/layout/simple.xml

  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
  3.     android:orientation=“vertical”
  4.     android:layout_width=“fill_parent”
  5.     android:layout_height=“fill_parent”
  6.     >
  7. <LinearLayout
  8.     android:orientation=“horizontal”
  9.     android:layout_width=“wrap_content”
  10.     android:layout_height=“wrap_content”
  11.     >
  12.  <Button
  13.    android:id=“@+id/button0”
  14.    android:layout_width=“wrap_content”
  15.    android:layout_height=“wrap_content”
  16.    android:text=“播放动画”
  17.  />
  18.   <Button
  19.    android:id=“@+id/button1”
  20.    android:layout_width=“wrap_content”
  21.    android:layout_height=“wrap_content”
  22.    android:text=“停止动画”
  23.  />
  24.  </LinearLayout>
  25.  <RadioGroup android:id=“@+id/radiogroup”
  26.      android:layout_width=“wrap_content”
  27.      android:layout_height=“wrap_content”
  28.      android:orientation=“horizontal”>
  29.    <RadioButton
  30.      android:id=“@+id/checkbox0”
  31.      android:layout_width=“wrap_content”
  32.      android:layout_height=“wrap_content”
  33.      android:checked=“true”
  34.      android:text=“单次播放”
  35.    />
  36.   <RadioButton
  37.     android:id=“@+id/checkbox1”
  38.     android:layout_width=“wrap_content”
  39.     android:layout_height=“wrap_content”
  40.     android:text=“循环播放”
  41.    />
  42.    </RadioGroup>
  43.     <TextView
  44.     android:layout_width=“wrap_content”
  45.     android:layout_height=“wrap_content”
  46.     android:text=“拖动进度条修改透明度(0 – 255)之间”
  47.     />
  48.   <SeekBar
  49.     android:id=“@+id/seekBar”
  50.     android:layout_width=“fill_parent”
  51.     android:layout_height=“wrap_content”
  52.     android:max=“256”
  53.     android:progress=“256”/>
  54.   <ImageView
  55.    android:id=“@+id/imageView”
  56.    android:background=“@anim/animation”
  57.    android:layout_width=“wrap_content”
  58.    android:layout_height=“wrap_content”
  59.  />
  60. </LinearLayout>

控制帧播放的/anim/animation.xml

  1. <animation-list xmlns:android=“http://schemas.android.com/apk/res/android” android:oneshot=“false”>
  2.  <item android:drawable=“@drawable/a” android:duration=“100” />
  3.  <item android:drawable=“@drawable/b” android:duration=“100” />
  4.  <item android:drawable=“@drawable/c” android:duration=“100” />
  5.  <item android:drawable=“@drawable/d” android:duration=“100” />
  6.  <item android:drawable=“@drawable/e” android:duration=“100” />
  7.  <item android:drawable=“@drawable/f” android:duration=“100” />
  8.  <item android:drawable=“@drawable/g” android:duration=“100” />
  9.  <item android:drawable=“@drawable/h” android:duration=“100” />
  10.  <item android:drawable=“@drawable/i” android:duration=“100” />
  11.  <item android:drawable=“@drawable/j” android:duration=“100” />
  12.  </animation-list>

      看看内容应该是很好理解的,<animation-list>为动画的总标签,这里面放着帧动画 <item>标签,也就是说若干<item>标签的帧 组合在一起就是帧动画了。<animation-list > 标签中android:oneshot=”false” 这是一个非常重要的属性,默认为false 表示 动画循环播放, 如果这里写true 则表示动画只播发一次。 <item>标签中记录着每一帧的信息android:drawable=”@drawable/a”表示这一帧用的图片为”a”,下面以此类推。  android:duration=”100″ 表示这一帧持续100毫秒,可以根据这个值来调节动画播放的速度。

这是一个比较简单的布局文件,应该都能看懂吧。  我主要说一下 最后的这个 ImageView, 它就是用来显示我们的动画。 这里使用android:background=”@anim/animation”设置这个ImageView现实的背景为一个动画,动画资源的路径为res/anim/animation.xml   ,当然 设置background同样也可以在代码中设置。

  1. imageView.setBackgroundResource(R.anim.animation);


通过getBackground方法就可以拿到这个animationDrawable对象。

  1. /**拿到ImageView对象**/
  2. imageView = (ImageView)findViewById(R.id.imageView);
  3. /**通过ImageView对象拿到背景显示的AnimationDrawable**/
  4. animationDrawable = (AnimationDrawable) imageView.getBackground();


AnimationDrawable 就是用来控制这个帧动画,这个类中提供了很多方法。

animationDrawable.start(); 开始这个动画
animationDrawable.stop(); 结束这个动画
animationDrawable.setAlpha(100);设置动画的透明度, 取值范围(0 – 255)
animationDrawable.setOneShot(true); 设置单次播放
animationDrawable.setOneShot(false); 设置循环播放
animationDrawable.isRunning(); 判断动画是否正在播放
animationDrawable.getNumberOfFrames(); 得到动画的帧数。

宣教主警戒:拖动进度条设置Alpha值的时候 一定要使用     imageView.postInvalidate(); 方法来通知UI线程重绘屏幕中的imageView  否则会看不到透明的效果 。这里切记切记~~

谢谢CSDN博主宣雨松,牛人一枚。以后还会多多向他学习。

——————————————————————————————————————————-

 

http://blog.csdn.net/imdxt1986/article/details/7023868

在Android SDK中有两种Camera classes,一个是 android.hardware.Camera,这是用来操控相机功能的类。另一个是 android.graphics.Camera,这个类别能帮我们做些什么事呢?

Camera就像一个摄像机,一个物体在原地不动,然后我们带着这个摄像机四处移动,在摄像机里面呈现出来的画面,就会有立体感,就可以从各个角度观看这个物体。
它有旋转、平移的一系列方法,实际上都是在改变一个Matrix对象,一系列操作完毕之后,我们得到这个Matrix,然后画我们的物体,就可以了。

android.graphics.Camera 是一个可以让你将 2D 物件在 3D 空间中移动,并将在其移动后的结果画在屏幕上的类别。

打开api说明文件

1. //Public Constructors

2.   Camera()

创建一个新的摄像头,空的转换

3. //Public Methods

4.   void  applyToCanvas(Canvas canvas)

计算对应当前转换矩阵,并将其应用到指定的画布上。

5.   float  dotWithNormal(float dx, float dy, float dz)

6.   void  getMatrix(Matrix matrix)

计算对应当前转换矩阵,并将其复制到所提供的矩阵对象。

7.   void  restore()

Restores the saved state, if any.
恢复保存的状态,如果有的话。

8.  void rotate(float x, float y, float z)

Applies a rotation transform around all three axis.
适用于所有三个轴旋转变换。

8.   void  rotateX(float deg)

Applies a rotation transform around the X axis.
适用于绕X轴旋转变换。

9.   void  rotateY(float deg)

Applies a rotation transform around the Y axis.

适用于绕Y轴旋转变换。

10.   void  rotateZ(float deg)

Applies a rotation transform around the Z axis.

适用于绕Z轴旋转变换。

11.   void  save()

Saves the camera state.

12. setLocation(float x, float y, float z)

Sets the location of the camera.

设置摄像头的位置。
13.   void  translate(float x, float y, float z)

Applies a translation transform on all three axis.

适用于所有三个轴的翻译转换。

在 Android ,要做出 3D 的效果,你当然可以用 OpenGL 的函式。不过,如果你需要更快的显示速度,或者只是要做个简单的 3D 特效,

那千万不要忘了这个 android.graphics.Camera。

  1. package com.xxx;
  2. import android.content.Context;
  3. import android.graphics.Camera;
  4. import android.graphics.Matrix;
  5. import android.util.AttributeSet;
  6. import android.util.Log;
  7. import android.view.View;
  8. import android.view.animation.Transformation;
  9. import android.widget.Gallery;
  10. import android.widget.ImageView;
  11. public class GalleryFlow extends Gallery {
  12.     private Camera mCamera = new Camera();//相机类
  13.     private int mMaxRotationAngle = 80;//最大转动角度
  14.     private int mMaxZoom = –300;////最大缩放值
  15.     private int mCoveflowCenter;//半径值
  16.     public GalleryFlow(Context context) {
  17.         super(context);
  18.         Log.d(“tag”“1”);
  19.         //支持转换 ,执行getChildStaticTransformation方法
  20.         this.setStaticTransformationsEnabled(true);
  21.     }
  22.     public GalleryFlow(Context context, AttributeSet attrs) {
  23.         super(context, attrs);
  24.         Log.d(“tag”“2”);
  25.         this.setStaticTransformationsEnabled(true);
  26.     }
  27.     public GalleryFlow(Context context, AttributeSet attrs, int defStyle) {
  28.         super(context, attrs, defStyle);
  29.         Log.d(“tag”“3”);
  30.         this.setStaticTransformationsEnabled(true);
  31.     }
  32.     public int getMaxRotationAngle() {
  33.         return mMaxRotationAngle;
  34.     }
  35.     public void setMaxRotationAngle(int maxRotationAngle) {
  36.         mMaxRotationAngle = maxRotationAngle;
  37.     }
  38.     public int getMaxZoom() {
  39.         return mMaxZoom;
  40.     }
  41.     public void setMaxZoom(int maxZoom) {
  42.         mMaxZoom = maxZoom;
  43.     }
  44.     private int getCenterOfCoverflow() {
  45.         return (getWidth() – getPaddingLeft() – getPaddingRight()) / 2
  46.                         + getPaddingLeft();
  47.     }
  48.     private static int getCenterOfView(View view) {
  49.         Log.d(“tag”“view left :”+view.getLeft());
  50.         Log.d(“tag”“view width :”+view.getWidth());
  51.         return view.getLeft() + view.getWidth() / 2;
  52.     }
  53.    //控制gallery中每个图片的旋转(重写的gallery中方法)
  54.     @Override
  55.     protected boolean getChildStaticTransformation(View child, Transformation t) {
  56.         //取得当前子view的半径值
  57.         final int childCenter = getCenterOfView(child);
  58.         Log.d(“tag”“childCenter:”+childCenter);
  59.         final int childWidth = child.getWidth();
  60.         //旋转角度
  61.         int rotationAngle = 0;
  62.         //重置转换状态
  63.         t.clear();
  64.         //设置转换类型
  65.         t.setTransformationType(Transformation.TYPE_MATRIX);
  66.         //如果图片位于中心位置不需要进行旋转
  67.         if (childCenter == mCoveflowCenter) {
  68.             transformImageBitmap((ImageView) child, t, 0);
  69.         } else {
  70.             //根据图片在gallery中的位置来计算图片的旋转角度
  71.             rotationAngle = (int) (((float) (mCoveflowCenter – childCenter) / childWidth) * mMaxRotationAngle);
  72.             Log.d(“tag”“rotationAngle:”+rotationAngle);
  73.             //如果旋转角度绝对值大于最大旋转角度返回(-mMaxRotationAngle或mMaxRotationAngle;)
  74.             if (Math.abs(rotationAngle) > mMaxRotationAngle) {
  75.                 rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle : mMaxRotationAngle;
  76.             }
  77.             transformImageBitmap((ImageView) child, t, rotationAngle);
  78.         }
  79.         return true;
  80.     }
  81.     @Override
  82.     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  83.         mCoveflowCenter = getCenterOfCoverflow();
  84.         super.onSizeChanged(w, h, oldw, oldh);
  85.     }
  86.     private void transformImageBitmap(ImageView child, Transformation t,
  87.                     int rotationAngle) {
  88.         //对效果进行保存
  89.         mCamera.save();
  90.         final Matrix imageMatrix = t.getMatrix();
  91.         //图片高度
  92.         final int imageHeight = child.getLayoutParams().height;
  93.         //图片宽度
  94.         final int imageWidth = child.getLayoutParams().width;
  95.         //返回旋转角度的绝对值
  96.         final int rotation = Math.abs(rotationAngle);
  97.         // 在Z轴上正向移动camera的视角,实际效果为放大图片。
  98.         // 如果在Y轴上移动,则图片上下移动;X轴上对应图片左右移动。
  99.         mCamera.translate(0.0f, 10.0f, 200.0f);// X值越大图片越靠右Y值越大是图片位置越高Z值越高图片越缩小
  100.         // As the angle of the view gets less, zoom in
  101.         if (rotation < mMaxRotationAngle) {
  102.             float zoomAmount = (float) (mMaxZoom + (rotation * 1.5));
  103.             mCamera.translate(0.0f, 0.0f, zoomAmount);
  104.         }
  105.         // 在Y轴上旋转,对应图片竖向向里翻转。
  106.         // 如果在X轴上旋转,则对应图片横向向里翻转。
  107.         mCamera.rotateY(rotationAngle);
  108.         mCamera.getMatrix(imageMatrix);
  109.       //以图片的中心点为旋转中心,如果不加这两句,就是以(0,0)点为旋转中心
  110.         imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2));
  111.         imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2));
  112.         mCamera.restore();//恢复
  113.     }
  114. }

http://blog.csdn.net/xushuaic/article/details/40424379

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/xushuaic/article/details/40322345

前言:

关于动画方面的知识也整理一段时间了,如题,这篇文章简单的介绍了View和Property动画的概念,如何在项目中创建资源文件,以及如何在代码中使用它们,本次整理动画的重点放在了Property动画上,下一篇文章将详细的分析Property动画几个重要的类,并分析几个开源库的实现,敬请期待。

View anim (Tween/Frame)Tween动画

主要有4中:缩放、平移、渐变、旋转

文件位置: res/anim/filename.xml编译资源的数据类型:an Animation.
资源引用:
Java: R.anim.filename
XML: @[package:]anim/filename

<?xml version="1.0" encoding="utf-8"?>	<set xmlns:android="http://schemas.android.com/apk/res/android"	    android:interpolator="@[package:]anim/interpolator_resource"	    android:shareInterpolator=["true" | "false"] >	    <alpha		android:fromAlpha="float"		android:toAlpha="float" />	    <scale		android:fromXScale="float"		android:toXScale="float"		android:fromYScale="float"		android:toYScale="float"		android:pivotX="float"		android:pivotY="float" />	    <translate		android:fromXDelta="float"		android:toXDelta="float"		android:fromYDelta="float"		android:toYDelta="float" />	    <rotate		android:fromDegrees="float"		android:toDegrees="float"		android:pivotX="float"		android:pivotY="float" />	    <set>		...	    </set>	</set>

布局文件必须有一个独立的根元素,可以是<alpha>, <scale>, <translate>, <rotate>, or <set>(持有一组其它的动画元素,甚至可以是内嵌的set元素) 中的一个

<set>
一个持有其它动画元素的容器(<alpha>, <scale>, <translate>, <rotate>) 或者其它 <set> 元素),代表一个动画集合

属性

android:interpolator(插值器)

应用于动画的插值器。该值必须是一个指定了插值器资源的引用(不是一个插值器的类名),在平台中有缺省的插值器资源可以使用,或者你可以创建自己的插值器资源,可以看下面关于插值器的讨论。

android:shareInterpolator

Boolean值, true:代表在所有的子元素中共享同一个插值器<alpha>

A fade-in or fade-out animation. Represents an AlphaAnimation.

一个渐入渐出的动画,对应的java类为AlphaAnimation。

属性

android:fromAlpha
android:toAlpha

代表动画开始和结束时透明度,0.0表示完全透明,1.0表示完全不透明,Float值

<scale>

可以实现动态调控件尺寸的效果,通过设置pivotX和pivotY你可以指定image缩放的中心点,比如:如果这些值是0,则表示左上角,所有的缩放变化将沿着右下角的轨迹运动。对应的类为:ScaleAnimation

属性:

android:fromXScale

android:toXScale

android:fromYScale

android:toYScale

Float值,为动画起始到结束时,X、Y坐标上的伸缩尺寸
0.0表示收缩到没有
1.0表示正常无伸缩

android:pivotX

android:pivotY

代表缩放的中轴点X/Y坐标,浮点值
如果我们想表示中轴点为图像的中心,我们可以把两个属性值定义成0.5或者50%。

<translate>

代表一个水平、垂直的位移。对应的类为TranslateAnimation.属性

android:fromXDelta  属性代表起始X方向的位置
android:toXDelta
android:fromYDelta

android:toYDelta

代表动画起始或者结束X / Y方向上的位置,Float或者百分比值
浮点数num%、num%p分别相对于自身或者父控件
如果以浮点数字表示,是一个绝对值,代表相对自身原始位置的像素值;
如果以num%表示,代表相对于自己的百分比,比如toXDelta定义为100%就表示在X方向上移动自己的1倍距离
如果以num%p表示,代表相对于父类组件的百分比。

<rotate> 

是旋转动画,与之对应的Java类是RotateAnimation属性
android:fromDegrees
android:toDegrees

代表起始和结束的角度,浮点值,单位:度android:pivotX 属性代表旋转中心的X坐标值

android:pivotY 属性代表旋转中心的Y坐标值

Float值或者百分比

这两个属性也有三种表示方式,但是X轴都是相对方向都是Left,Y轴都是相对于Top

浮点数、num%、num%p;
数字方式代表相对于自身左边缘的像素值,
num%方式代表相对于自身左边缘或顶边缘的百分比,
num%p方式代表相对于父容器的左边缘或顶边缘的百分比。

属性:

android:fromDegrees

android:toDegrees

开始和结束时的弧度位置,单位是度,Float值

调用代码

ImageView image = (ImageView) findViewById(R.id.image);Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);image.startAnimation(hyperspaceJump);

另外,在动画中,如果我们添加了android:fillAfter=”true”后,这个动画执行完之后保持最后的状态;android:duration=”integer”代表动画持续的时间,单位为毫秒。

插值器

用于修改一个动画过程中的速率,可以定义各种各样的非线性变化函数,比如加速、减速等。在Android中所有的插值器都是Interpolator 的子类,通过 android:interpolator 属性你可以引用不同的插值器。下面是几种插值器:

 

你可以通过下面的方式使用它们

<set android:interpolator="@android:anim/accelerate_interpolator">	    ...</set>

自定义插值器
如果你对系统提供的插值器不满意,我们可以创建一个插值器资源修改插值器的属性,比如修改AnticipateInterpolator的加速速率,调整CycleInterpolator的循环次数等。为了完成这种需求,我们需要创建XML资源文件,然后将其放于/res/anim下,然后再动画元素中引用即可。我们先来看一下几种常见的插值器可调整的属性:

<?xml version="1.0" encoding="utf-8"?>	<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"	    android:attribute_name="value" />

我们先来看一下几种常见的插值器可调整的属性:

<accelerateDecelerateInterpolator> 无
<accelerateInterpolator> android:factor 浮点值,加速速率,默认为1
<anticipateInterploator> android:tension 浮点值,起始点后退的张力、拉力数,默认为2
<anticipateOvershootInterpolator> android:tension 同上 android:extraTension 浮点值,拉力的倍数,默认为1.5(2  * 1.5)
<bounceInterpolator> 无
<cycleInterplolator> android:cycles int,循环的个数,默认为1
<decelerateInterpolator> android:factor 浮点值,减速的速率,默认为1
<linearInterpolator> 无
<overshootInterpolator> 浮点值,超出终点后的张力、拉力,默认为2

比如:res/anim/my_overshoot_interpolator.xml:

<?xml version="1.0" encoding="utf-8"?><overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"android:tension="7.0"/>	This animation XML will apply the interpolator: 	<scale xmlns:android="http://schemas.android.com/apk/res/android"	    android:interpolator="@anim/my_overshoot_interpolator"	    android:fromXScale="1.0"	    android:toXScale="3.0"	    android:fromYScale="1.0"	    android:toYScale="3.0"	    android:pivotX="50%"	    android:pivotY="50%"	    android:duration="700" />

如果简单的修改插值器的属性值还不能够满足我们的需求,那么就自己来通过实现Interpolator接口来定义自己的插值器了
因为上面所有的Interpolator都实现了Interpolator接口,这个接口定义了一个方法:float getInterpolation(float input);
此方法由系统调用,input代表动画的时间,在0和1之间,也就是开始和结束之间。

线性(匀速)插值器定义如下:

public float getInterpolation(float input) {  	    return input;  }  

加速减速插值器定义如下:

public float getInterpolation(float input) {  	    return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;  }  

Frame动画

文件目录:res/drawable/filename.xml编译资源数据类型 AnimationDrawable
资源引用:
Java: R.drawable.filename
XML: @[package:]drawable.filename

<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android"   android:oneshot=["true" | "false"] >	<item		android:drawable="@[package:]drawable/drawable_resource_name"		android:duration="integer" /></animation-list>

<animation-list>必须作为根元素,包含一个或者多个根元素

属性:android:oneshot :true:只执行一次动画,false:循环执行

<item>

A single frame of animation. Must be a child of a <animation-list> element.
一帧独立动画,必须是<animation-list>的子元素。

属性

android:drawable
Drawable资源,用于这一帧的图片。

android:duration
Integer类型.该帧的时长,单位为毫秒milliseconds.

res/anim/rocket.xml:		<?xml version="1.0" encoding="utf-8"?>		<animation-list xmlns:android="http://schemas.android.com/apk/res/android"		    android:oneshot="false">		    <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />		    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />		    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />		</animation-list>

调用代码:

ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);rocketImage.setBackgroundResource(R.drawable.rocket_thrust);rocketAnimation = (AnimationDrawable) rocketImage.getBackground();rocketAnimation.start();</span>

View anim与property anim 的比较

View anim 系统:

view animation system提供的能力只能够为View添加动画。因此如果你想为非View对象添加动画,就必须自己去实现,
view animation system在View动画的展现方面也是有约束的,只暴露了View的很少方面。比如View支持缩放和旋转,但不支持背景颜色的动画。
view animation system的另一劣势是,其改变的是View的绘制效果,真正的View的属性保持不变,比如无论你在对话中如何缩放Button的大小,Button的有效点击区域还是没有应用到动画时的区域,其位置与大小都不变。

但是View animation system只需花费很少时间创建而且只需很少的代码。如果View 动画完成了你所有的动作,或者你存在的代码已经达到了你想要的效果,就没必要使用property 动画系统了。

property anim 系统:

完全弥补了View anim System的缺陷,你可以为一个对象的任何属性添加动画,(View或者非View),同时对象自己也会被修改。

并且当属性变化的时候,property Anim系统会自动的刷新屏幕。属性动画系统在处理动画方面也更加强劲。更高级的,你可以指定动画的属性,比如颜色,位置,大小,定义动画的插值器并且同步多个动画。

并且在Property Animation中,改变的是对象的实际属性,如Button的缩放,Button的位置与大小属性值都改变了。而且Property Animation不止可以应用于View,还可以应用于任何对象。

 Property Animation

目录:res/animator/filename.xm

编译后的资源为:ValueAnimator, ObjectAnimator, or AnimatorSet.

XML文件的根元素必须为<set>, <objectAnimator>, or <valueAnimator>之一。也可以在一个set中组织不同的动画,包含其它<set>元素。也就是说,可以嵌套。

<set  android:ordering=["together" | "sequentially"]>     <objectAnimator        android:propertyName="string"        android:duration="int"        android:valueFrom="float | int | color"        android:valueTo="float | int | color"        android:startOffset="int"        android:repeatCount="int"        android:repeatMode=["repeat" | "reverse"]        android:valueType=["intType" | "floatType"]/>     <animator        android:duration="int"        android:valueFrom="float | int | color"        android:valueTo="float | int | color"        android:startOffset="int"        android:repeatCount="int"        android:repeatMode=["repeat" | "reverse"]        android:valueType=["intType" | "floatType"]/>     <set>        ...    </set></set>

元素介绍

<set>

动画集合节点,有一个属性ordering,表示它的子动画启动方式是先后有序的还是同时。

属性

sequentially:动画按照先后顺序together (default) :动画同时启动

<objectAnimator>

一个对象的一个属性,相应的Java类为:ObjectAnimator

属性

android:propertyName

String类型,必须要设定的值,代表要执行动画的属性,通过名字引用,比如你可以指定了一个View的”alpha” 或者 “backgroundColor” ,这个objectAnimator元素没有暴露target属性,因此比不能够在XML中执行一个动画,必须通过调用loadAnimator() 填充你的XML动画资源,并且调用setTarget() 应用到拥有这个属性的目标对象上。

android:valueTo:Float、int或者color,也是必须值,表明了动画结束的点,颜色由6位十六进制的数字表示。android:valueFrom:相对应valueTo,动画的起始点,如果没有指定,系统会通过属性身上的get 方法获取 ,颜色也是6位十六进制的数字表示。

android:duration:动画的时长,int类型,以毫秒为单位,默认为300毫秒。
android:startOffset:动画延迟的时间,从调用start方法后开始计算,int型,毫秒为单位,
android:repeatCount:一个动画的重复次数,int型,”-1“表示无限循环,”1“表示动画在第一次执行完成后重复执行一次,也就是两次,默认为0,不重复执行。
android:repeatMode:重复模式:int型,当一个动画执行完的时候应该如何处理。该值必须是正数或者是-1,

“reverse”会使得按照动画向相反的方向执行,可实现类似钟摆效果。

“repeat”会使得动画每次都从头开始循环。

android:valueType:关键参数,如果该value是一个颜色,那么就不需要指定,因为动画框架会自动的处理颜色值。

有intType和floatType两种:分别说明动画值为int和float型。

<animator>

 

在一个特定的时间里执行一个动画。相对应的是ValueAnimator.所有的属性和<objectAnimator>一样
android:valueTo
android:valueFrom
android:duration
android:startOffset
android:repeatCount
android:repeatMode
android:valueType
Value Description
floatType (default)

res/animator/property_animator.xml:

<set android:ordering="sequentially">    <set>        <objectAnimator            android:propertyName="x"            android:duration="500"            android:valueTo="400"            android:valueType="intType"/>        <objectAnimator            android:propertyName="y"            android:duration="500"            android:valueTo="300"            android:valueType="intType"/>    </set>    <objectAnimator        android:propertyName="alpha"        android:duration="500"        android:valueTo="1f"/></set>

为了执行该动画,必须在代码中将该动画资源文件填充为一个AnimationSet对象,然后在执行动画前,为目标对象设置所有的动画集合。
简便的方法就是通过setTarget方法为目标对象设置动画集合,代码如下:

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,   R.anim.property_animator);set.setTarget(myObject);set.start();

平时使用的简单动画特效,使用View动画就可以满足,但是如果你想做的更加复杂,比如背景色的动画,或者不仅是View,还希望对其它对象添加动画等,那么你就得考虑使用Property动画了,随着Android应用慢慢对用户体验的重视,相信属性动画一定会大放异彩,以后一定会常和它打交道,所以在下一篇文章中,我会单独深入的分析属性动画,以及其实现原理,敬请期待。

参考文献:
http://developer.android.com/guide/topics/resources/animation-resource.html#val-animator-element
http://blog.csdn.net/liuhe688/article/details/6660823