一、基礎知識:
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; //圖片運