实习第八天:SurfaceView显示动画效果(1)

2019-04-15 15:27发布

原文地址:http://blog.csdn.net/ypist/article/details/8571032
一、基础知识: SurfaceView继承自View,View负责在主线程中更新动画,而SurfaceView是在一个新线程中更新动画。

SurfaceView类的主要方法:
// 在SurfaceView创建时调用
pubilic abstract void surfaceCreated(SurfaceHolder holder)
// 在SurfaceView改变时调用
pubilic abstract void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
// 在SurfaceView销毁时调用
pubilic abstract void surfaceDestroyed(SurfaceHolder holder)
// 绘制SurfaceView画面
protected void onDraw(Canvas canvas)
(参数canvas是该SurfaceView的画笔,每一次SurfaceView中画面改变都是调用了该方法)

二、实现效果: 首先有一副图片从屏幕的左下角开始向右上方运动,当图片上沿与手机屏幕上沿相撞时,图片的水平速度大小与方向均不变,竖直方向上速度大小不变,
方向相反;当下沿相撞后,同样效果,直到图片飞出屏幕。之后,屏幕渐渐地显示一幅图片。

三、编程实现: 1. 界面编辑(reslayoutmain.xml): [java] view plain copy
  1. "1.0" encoding="utf-8"?>  
  2. "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.     android:layout_width="fill_parent"   
  8.     android:layout_height="wrap_content"   
  9.     android:text="@string/hello"  
  10.     />  
  11.   

2. 代码编辑: (srcwyfzclMyActivity.Java)
[java] view plain copy
  1. package wyf.zcl;  
  2. /* 
  3.  *  该例子演示surfaceView中简单场景的绘制 
  4.  *  MyActivity.java     为程序的主Activity 
  5.  *  MySurfaceView.java  为程序的SurfaceView类 
  6.  *  Constant.java       常量类,将常量全部写在该类中 
  7.  *  OnDrawThread.java   该类的作用是时时刷新onDraw,进行画面的重绘 
  8.  *  PicRunThread.java   该类是控制duke图片运动的类 
  9.  * */  
  10. import android.app.Activity;                        //引入相关包  
  11. import android.content.pm.ActivityInfo;             //引入相关包  
  12. import android.os.Bundle;                           //引入相关包  
  13. import android.view.Window;                         //引入相关包  
  14. import android.view.WindowManager;                  //引入相关包   
  15. public class MyActivity extends Activity {  
  16.     /** Called when the activity is first created. */  
  17.     private MySurfaceView msv;          //得到surfaceView的引用  
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState) {   //Activity的生命周期函数,该函数是在程序创建时调用  
  20.         super.onCreate(savedInstanceState);  
  21.         msv=new MySurfaceView(MyActivity.this);         //实例化MySurfaceView的对象  
  22.         requestWindowFeature(Window.FEATURE_NO_TITLE);  //设置屏幕显示没有title栏   
  23.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN ,    
  24.                       WindowManager.LayoutParams.FLAG_FULLSCREEN);  //设置全屏  
  25.         //设置只允许横屏  
  26.         this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
  27.         setContentView(msv);                            //设置Activity显示的内容为msv  
  28.     }  
  29. }  

(srcwyfzclConstant.java) [java] view plain copy
  1. package wyf.zcl;  
  2. import android.view.Display;  
  3. //Constant.java     常量类,将常量全部写在该类中  
  4. public class Constant {  
  5.     public static int SCREENWIDTH=480;  //屏幕宽(本程序为横屏)  
  6.     public static int SCREENHEIGHT=320;     //屏幕高  
  7.     public static int PICWIDTH=64;          //图片宽度  
  8.     public static int PICHEIGHT=64;         //图片高度  
  9.     public static int ONDRAWSPEED=30;       //onDraw线程类的绘制间隔时间  
  10.     public static float PICXSPEED=1.5f;     //图片水平移动速度  
  11.     public static float PICYSPEED=2;        //图片垂直移动速度  
  12.     public static int PICRUNSPEED=30;       //图片的运动线程的刷新速度  
  13.     public static int PICALPHASPEED=20//图片渐暗效果演示刷新速度  
  14. }  

(srcwyfzclMySurfaceView.java)
[java] view plain copy
  1. package wyf.zcl;  
  2. import android.content.Context;                 //引入相关包  
  3. import android.graphics.Bitmap;                 //引入相关包  
  4. import android.graphics.BitmapFactory;          //引入相关包  
  5. import android.graphics.Canvas;                 //引入相关包  
  6. import android.graphics.Color;                  //引入相关包  
  7. import android.graphics.Paint;                  //引入相关包  
  8. import android.view.Display;                    //引入相关包  
  9. import android.view.SurfaceHolder;              //引入相关包  
  10. import android.view.SurfaceView;                //引入相关包  
  11. public class MySurfaceView extends SurfaceView  
  12. implements SurfaceHolder.Callback{            
  13.     //此处实现SurfaceHolder.Callback接口,为surfaceView添加生命周期回调函数  
  14.     int dy=Display.DEFAULT_DISPLAY;