一、基础知识:
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; //图片运