第十二天.Android动画技术

12.1 Tween动画

12.1.1 动画实现

  • Tween动画 对场景中的对象不断进行图像变换,如平移、缩放、旋转。
  • Frame帧动画 顺序播放事先做好的图像,如电影。
  • GIF动画

12.1.2 代码实现Tween动画1

/* 装载资源 */
Bitmap mBitQQ mBitQQ 
  = ((BitmapDrawable)getResources().getDrawable(R.drawable.qq)).getBitmap();
/* 绘制图片 */
canvas.drawBitmap(mBitQQ, 0, 0, null); 

/* 创建Alpha动画 */
private Animation mAnimationAlpha = newAlphaAnimation(0.1f, 1.0f);
/* 设置动画的时间 */
mAnimationAlpha.setDuration(3000);
/* 开始播放动画 */
this.startAnimation(mAnimationAlpha);

/* 创建Scale动画 */
private Animation mAnimationScale 
  =newScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f,Animation.RELATIVE_TO_SELF, 
                     0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
/* 设置动画的时间 */
mAnimationScale.setDuration(500);
/* 开始播放动画 */
this.startAnimation(mAnimationScale);

12.1.3 代码实现Tween动画2

/* 创建Translate动画 */
private Animation mAnimationTranslate 
  =new TranslateAnimation(10, 100,10, 100);
/* 设置动画的时间 */
mAnimationTranslate.setDuration(1000);
/* 开始播放动画 */
this.startAnimation(mAnimationTranslate);

/* 创建Rotate动画 */
private Animation mAnimationRotate
  =newRotateAnimation(0.0f, +360.0f,Animation.RELATIVE_TO_SELF,
                      0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
/* 设置动画的时间 */
mAnimationRotate.setDuration(1000);
/* 开始播放动画 */
this.startAnimation(mAnimationRotate);

12.2.4 代码实现Tween动画:main.xml

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"    >
<TextView  
   android:layout_width="fill_parent"    android:layout_height="wrap_content" 
   android:text="@string/hello"   />
   <Button
   android:id="@+id/AlphaAnimation"   android:layout_width="fill_parent"
   android:layout_height="wrap_content"    android:text="Alpha动画"/>
   <Button
   android:id="@+id/ScaleAnimation"   android:layout_width="fill_parent"
   android:layout_height="wrap_content"    android:text="Scale动画"/>
   <Button
   android:id="@+id/TranslateAnimation"    android:layout_width="fill_parent"
   android:layout_height="wrap_content"    android:text="Translate动画"/>
   <Button
   android:id="@+id/RotateAnimation"   android:layout_width="fill_parent"
   android:layout_height="wrap_content"    android:text="Rotate动画"/>
</LinearLayout>

12.2.5 XML布局实现Tween动画

/* 装载动画布局 */
mAnimationAlpha =AnimationUtils.loadAnimation(mContext,R.anim.alpha_animation);
/* 开始播放动画 */
this.startAnimation(mAnimationAlpha);
/* 装载动画布局 */
mAnimationScale =AnimationUtils.loadAnimation(mContext,R.anim.scale_animation);
this.startAnimation(mAnimationScale);
/* 装载动画布局 */
mAnimationTranslate =AnimationUtils.loadAnimation(mContext,R.anim.translate_animation);
this.startAnimation(mAnimationTranslate);
/* 装载动画布局 */
mAnimationRotate =AnimationUtils.loadAnimation(mContext,R.anim.rotate_animation);
this.startAnimation(mAnimationRotate);

R.anim.alpha_animation

<setxmlns:android="http://schemas.android.com/apk/res/android" >
<alpha
       android:fromAlpha="0.1"
       android:toAlpha="1.0"
       android:duration="2000"
/> 
</set>

R.anim.scale_animation

<setxmlns:android="http://schemas.android.com/apk/res/android">
  <scale
         android:interpolator="@android:anim/accelerate_decelerate_interpolator"

         android:fromXScale="0.0"
         android:toXScale="1.0"

         android:fromYScale="0.0"
         android:toYScale="1.0"

         android:pivotX="50%"
         android:pivotY="50%"

         android:fillAfter="false"
         android:duration="500" />
</set>

R.anim.translate_animation

<setxmlns:android="http://schemas.android.com/apk/res/android">
<translate
       android:fromXDelta="10"
       android:toXDelta="100"
       android:fromYDelta="10"
       android:toYDelta="100"
       android:duration="1000"
/>
</set>

R.anim.rotate_animation

<set xmlns:android="http://schemas.android.com/apk/res/android">        
<rotate
android:interpolator="@android:anim/accelerate_decelerate_interpolator"

       android:fromDegrees="0" 
       android:toDegrees="+360"

       android:pivotX="50%" 
       android:pivotY="50%"    

       android:duration="1000" />
</set>

案例AnimationDemo2

12.2 Frame帧动画

12.2.1 代码实现Frame动画

/* 实例化AnimationDrawable对象 */
        private AnimationDrawable frameAnimation = newAnimationDrawable();
       /*装载资源 */
       //这里用一个循环了装载所有名字类似的资源,如“a1.......15.png”的图片
       for(int i = 1; i <= 15; i++){
              intid = getResources().getIdentifier("a" + i, "drawable",                                               
mContext.getPackageName());
               Drawable mBitAnimation =getResources().getDrawable(id);
              /*为动画添加一帧 */
              //参数mBitAnimation是该帧的图片
              //参数500是该帧显示的时间,按毫秒计算
              frameAnimation.addFrame(mBitAnimation,500);
       }
       /*设置播放模式是否循环false表示循环而true表示不循环 */
       frameAnimation.setOneShot(false );  
       /*设置本类将要显示这个动画 */
       this.setBackgroundDrawable(frameAnimation);            
       /*开始播放动画 */
       frameAnimation.start();

案例AnimationDrawableDemo

12.2.2 XML实现Frame动画

/* 定义AnimationDrawable动画对象 */
private AnimationDrawable frameAnimation= null;
/* 定义一个ImageView用来显示动画 */
ImageView img = new ImageView(mContext);
/* 装载动画布局文件 */
img.setBackgroundResource(R.anim.frameanimation);        
/* 构建动画 */
private AnimationDrawable frameAnimation= (AnimationDrawable) img.getBackground();
/* 设置是否循环 */
frameAnimation.setOneShot( false );  
/* 设置该类显示的动画 */
this.setBackgroundDrawable(frameAnimation);
/* 开始播放动画 */
frameAnimation.start();

frameanimation.xml

<animation-listxmlns:android="http://schemas.android.com/apk/res/android"
   android:oneshot="false">
   <item android:drawable="@drawable/a1"android:duration="500" />
   <item android:drawable="@drawable/a2"android:duration="500" />
   <item android:drawable="@drawable/a3"android:duration="500" />
   <item android:drawable="@drawable/a4"android:duration="500" />
   <item android:drawable="@drawable/a5"android:duration="500" />
   <item android:drawable="@drawable/a6"android:duration="500" />
   <item android:drawable="@drawable/a7"android:duration="500" />
   <item android:drawable="@drawable/a8"android:duration="500" />
   <item android:drawable="@drawable/a9"android:duration="500" />
   <item android:drawable="@drawable/a10"android:duration="500" />
   <item android:drawable="@drawable/a11"android:duration="500" />
   <item android:drawable="@drawable/a12"android:duration="500" />
   <item android:drawable="@drawable/a13"android:duration="500" />
   <item android:drawable="@drawable/a14"android:duration="500" />
   <item android:drawable="@drawable/a15"android:duration="500" />     
</animation-list>

案例AnimationDrawableDemo2

12.3 GIF动画

  • 简单介绍案例GifAnimationDemo

12.4 全屏与横屏技术

public void onCreate(BundlesavedInstanceState){
       super.onCreate(savedInstanceState);

       /*设置为无标题栏 */
       requestWindowFeature(Window.FEATURE_NO_TITLE);

       /*设置为全屏模式 */             
         getWindow().setFlags(
             WindowManager.LayoutParams.FLAG_FULLSCREEN,
             WindowManager.LayoutParams.FLAG_FULLSCREEN); 

       /*设置为横屏 */       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
              setContentView(R.layout.main);
       }

全屏技术在拍照、录制视频、游戏中很常用

12.5 获取屏幕属性

public void onCreate(BundlesavedInstanceState){
              super.onCreate(savedInstanceState);
              setContentView(R.layout.main);
              /*定义DisplayMetrics对象 */
              DisplayMetricsdm = new DisplayMetrics();           
              /*取得窗口属性 */
              getWindowManager().getDefaultDisplay().getMetrics(dm);
              /*窗口的宽度 */
              intscreenWidth = dm.widthPixels;          
              /*窗口的高度 */
              intscreenHeight = dm.heightPixels;
              mTextView= (TextView) findViewById(R.id.TextView01);
              mTextView.setText("屏幕宽度:" + screenWidth + 
                                "\n屏幕高度:" + screenHeight);
       }

示例下载