您现在的位置: 万盛学电脑网 >> 程序编程 >> 网络编程 >> 安卓开发 >> 正文

Android开发之SurfaceView显示动画效果

作者:佚名    责任编辑:admin    更新时间:2022-06-22

  一、基础知识:

  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]

  

  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  >

  

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  android:text="@string/hello"

  />

  

  

  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  >

  

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  android:text="@string/hello"

  />

  

  2. 代码编辑:

  (srcwyfzclMyActivity.java)

  [java]

  package wyf.zcl;

  /*

  * 该例子演示surfaceView中简单场景的绘制

  * MyActivity.java 为程序的主Activity

  * MySurfaceView.java 为程序的SurfaceView类

  * Constant.java 常量类,将常量全部写在该类中

  * OnDrawThread.java 该类的作用是时时刷新onDraw,进行画面的重绘

  * PicRunThread.java 该类是控制duke图片运动的类

  * */

  import android.app.Activity; //引入相关包

  import android.content.pm.ActivityInfo; //引入相关包

  import android.os.Bundle; //引入相关包

  import android.view.Window; //引入相关包

  import android.view.WindowManager; //引入相关包

  public class MyActivity extends Activity {

  /** Called when the activity is first created. */

  private MySurfaceView msv; //得到surfaceView的引用

  @Override

  public void onCreate(Bundle savedInstanceState) { //Activity的生命周期函数,该函数是在程序创建时调用

  super.onCreate(savedInstanceState);

  msv=new MySurfaceView(MyActivity.this); //实例化MySurfaceView的对象

  requestWindowFeature(Window.FEATURE_NO_TITLE); //设置屏幕显示没有title栏

  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN ,

  WindowManager.LayoutParams.FLAG_FULLSCREEN); //设置全屏

  //设置只允许横屏

  this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

  setContentView(msv); //设置Activity显示的内容为msv

  }

  }

  package wyf.zcl;

  /*

  * 该例子演示surfaceView中简单场景的绘制

  * MyActivity.java 为程序的主Activity

  * MySurfaceView.java 为程序的SurfaceView类

  * Constant.java 常量类,将常量全部写在该类中

  * OnDrawThread.java 该类的作用是时时刷新onDraw,进行画面的重绘

  * PicRunThread.java 该类是控制duke图片运动的类

  * */

  import android.app.Activity; //引入相关包

  import android.content.pm.ActivityInfo; //引入相关包

  import android.os.Bundle; //引入相关包

  import android.view.Window; //引入相关包

  import android.view.WindowManager; //引入相关包

  public class MyActivity extends Activity {

  /** Called when the activity is first created. */

  private MySurfaceView msv; //得到surfaceView的引用

  @Override

  public void onCreate(Bundle savedInstanceState) { //Activity的生命周期函数,该函数是在程序创建时调用

  super.onCreate(savedInstanceState);

  msv=new MySurfaceView(MyActivity.this); //实例化MySurfaceView的对象

  requestWindowFeature(Window.FEATURE_NO_TITLE); //设置屏幕显示没有title栏

  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN ,

  WindowManager.LayoutParams.FLAG_FULLSCREEN); //设置全屏

  //设置只允许横屏

  this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

  setContentView(msv); //设置Activity显示的内容为msv

  }

  }

  (srcwyfzclConstant.java)

  [java]

  package wyf.zcl;

  import android.view.Display;

  //Constant.java 常量类,将常量全部写在该类中

  public class Constant {

  public static int SCREENWIDTH=480; //屏幕宽(本程序为横屏)

  public static int SCREENHEIGHT=320; //屏幕高

  public static int PICWIDTH=64; //图片宽度

  public static int PICHEIGHT=64; //图片高度

  public static int ONDRAWSPEED=30; //onDraw线程类的绘制间隔时间

  public static float PICXSPEED=1.5f; //图片水平移动速度

  public static float PICYSPEED=2; //图片垂直移动速度

  public static int PICRUNSPEED=30; //图片的运动线程的刷新速度

  public static int PICALPHASPEED=20; //图片渐暗效果演示刷新速度

  }

  package wyf.zcl;

  import android.view.Display;

  //Constant.java 常量类,将常量全部写在该类中

  public class Constant {

  public static int SCREENWIDTH=480; //屏幕宽(本程序为横屏)

  public static int SCREENHEIGHT=320; //屏幕高

  public static int PICWIDTH=64; //图片宽度

  public static int PICHEIGHT=64; //图片高度

  public static int ONDRAWSPEED=30; //onDraw线程类的绘制间隔时间

  public static float PICXSPEED=1.5f; //图片水平移动速度

  public static float PICYSPEED=2; //图片垂直移动速度

  public static int PICRUNSPEED=30; //图片的运动线程的刷新速度

  public static int PICALPHASPEED=20; //图片渐暗效果演示刷新速度

  }

  (srcwyfzclMySurfaceView.java)

  [java]

  package wyf.zcl;

  import android.content.Context; //引入相关包

  import android.graphics.Bitmap; //引入相关包

  import android.graphics.BitmapFactory; //引入相关包

  import android.graphics.Canvas; //引入相关包

  import android.graphics.Color; //引入相关包

  import android.graphics.Paint; //引入相关包

  import android.view.Display; //引入相关包

  import android.view.SurfaceHolder; //引入相关包

  import android.view.SurfaceView; //引入相关包

  public class MySurfaceView extends SurfaceView

  implements SurfaceHolder.Callback{

  //此处实现SurfaceHolder.Callback接口,为surfaceView添加生命周期回调函数

  int dy=Display.DEFAULT_DISPLAY;

  MyActivity ma; //得到MyActivity的引用

  Paint paint; //画笔的引用

  OnDrawThread odt; //OnDrawThread类引用

  PicRunThread prt; //图片运