萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 安卓開發 >> Android開發之SurfaceView顯示動畫效果

Android開發之SurfaceView顯示動畫效果

  一、基礎知識:

  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; //圖片運

copyright © 萬盛學電腦網 all rights reserved