以下内容是实现两个画面的转换和一个画面的运动的效果,实现了一个我们也就可以举一反三了,其余的实现也就容易了。废话了一段,下面进入正题:
说得不好的各位大神尽管拍砖!
第一步:
建立工程什么的就不用说了,自己回去建立,不懂也不要问,自己Google~~
第二部:
新建一个类Welcome继承至SurfaceView类并实现其接口SurfaceHolder.Callback,这里实现的事第一个画面的类,也就是我们现实两个画面就使用两个类来实现,封装两个类。继承了SurfaceView之后就实现相应的创建,改变,销毁三个方法,这是这个类必须要求实现的,对于其中的为什么我也不懂。。创建方法的实现也就是我们创建这个类之后我们就开启这个类,由于我们在接下来还要定义一个内嵌线程,所以我们可以在创建里面实现我们的线程的启动start()方法。对于其他的什么构造方法什么的就自己看着办了,以及初始化什么的就自己看着办你想初始化什么就初始化什么了,想我现在用到一个需要绘制的图片还有坐标什么的我就自己在里面初始化就可以了。也就是这段内嵌线程的代码
class TutorialThread extends Thread{//刷帧线程
private int span = 500;//睡眠的毫秒数
private SurfaceHolder surfaceHolder;
private Welcome view;
private boolean flag = false;
public TutorialThread(SurfaceHolder surfaceHolder, Welcome view) {//构造器
this.surfaceHolder = surfaceHolder;
this.view = view;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public void run() { //重写run方法,实现现场的不断循环
Canvas c;
while (this.flag) {
c = null;
try {
// 锁定整个画布,在内存要求比较高的情况下,建议参数不要为null
c = this.surfaceHolder.lockCanvas(null);
synchronized(this.surfaceHolder) {
view.draw(c); //实现绘图的draw()方法,只好我们也会重写
}
} finally {
if (c != null) {
//更新屏幕显示内容
this.surfaceHolder.unlockCanvasAndPost(c);
}
}
try{
Thread.sleep(span);
}
catch(Exception e){
e.printStackTrace();
}
}
}
}
线程一直调用我们的run方法循环,draw()方法就不听的绘制我们的图片,下面是我们的draw()方法
public void draw(Canvas canvas) {
int px = viewX/5*3;
int py = viewY/5*3;
canvas.drawColor(Color.BLACK);
goods.draw(canvas);
//canvas.drawBitmap(background,10,10, null);
canvas.drawBitmap(button, px, py, null);
}
同样的想有几个画面的话可以多创建几个相似的类,或者在同一个类里面控制状态什么是盖显示什么也行,这里我使用一个消息参数来传回主Activity使用主Activity来控制显示状态,也就是我们转场标记
第三步:
我们在每一个继承至SurfaceView的画面类,添加了一个touchEvent监听时间,这样只要我们控制时间发生时我们向主Activity发送相应的消息参数我们就可以实现我们的画面的跳转了
例如在Welcome里面我们用一个按钮来触发时间的发生,当点击按钮时,我们就传递一个消息参数会主Activity然后由主Activity设置需要转换的画面
public boolean onTouchEvent(MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
int px = (int)event.getX();
int py = (int)event.getY();
if(px > viewX/5*3 && px < viewY/5*3+button.getWidth()
&& py > viewY/5*3 && py < viewY/5*3+button.getHeight()){//点击了重新游戏按钮
testActivity.myHandler.sendEmptyMessage(1);//向主activity发送Handler消息
}
// testActivity.myHandler.sendEmptyMessage(1);
}
return super.onTouchEvent(event);
}
在主Activity里面我们使用的是
Handler myHandler = new Handler(){//用来更新UI线程中的控件
public void handleMessage(Message msg) {
if(msg.what == 1)
{
if(welcome != null)
{
welcome = null;
}
toLoading();
}
else if(msg.what == 2)
{
if(loading != null)
{
loading = null;
}
toWelcome();
}
}
};
至此我们就可以实现了画面的切换,根据不同的状态信息绘制我们不同的画面了。
一下给出我写的一个简单我程序部分源代码:
第一个是Welcome:
package com.test;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class Welcome extends SurfaceView implements SurfaceHolder.Callback {
TestActivity testActivity;
SurfaceHolder surfaceHolder;
TutorialThread thread;
Bitmap background;
Bitmap button;
int viewX;
int viewY;
MoveThread moveThread;
good goods;
public Welcome(TestActivity activity2) {
super(activity2);
this.testActivity = activity2;
surfaceHolder = getHolder();
surfaceHolder.addCallback(this);
thread = new TutorialThread(surfaceHolder,this);
moveThread = new MoveThread(this);
viewX = activity2.viewX;
viewY = activity2.viewY;
initBitmap();
}
private void initBitmap() {
this.background = BitmapFactory.decodeResource(getResources(), R.drawable.backgroud);
this.button = BitmapFactory.decodeResource(getResources(),R.drawable.icon);
goods = new good(10, 400, background);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
this.thread.setFlag(true);
this.thread.start();
this.moveThread.setFlag(true);
this.moveThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
thread.setFlag(false);
moveThread.setFlag(false);
while (retry) {
try {
moveThread.join();
thread.join();
retry = false;
}
catch (InterruptedException e) {//不断地循环,直到刷帧线程结束
}
}
// TODO Auto-generated method stub
}
public void draw(Canvas canvas) {
int px = viewX/5*3;
int py = viewY/5*3;
canvas.drawColor(Color.BLACK);
goods.draw(canvas);
//canvas.drawBitmap(background,10,10, null);
canvas.drawBitmap(button, px, py, null);
}
public boolean onTouchEvent(MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
int px = (int)event.getX();
int py = (int)event.getY();
if(px > viewX/5*3 && px < viewY/5*3+button.getWidth()
&& py > viewY/5*3 && py < viewY/5*3+button.getHeight()){//点击了重新游戏按钮
testActivity.myHandler.sendEmptyMessage(1);//向主activity发送Handler消息
}
// testActivity.myHandler.sendEmptyMessage(1);
}
return super.onTouchEvent(event);
}
class TutorialThread extends Thread{//刷帧线程
private int span = 500;//睡眠的毫秒数
private SurfaceHolder surfaceHolder;
private Welcome view;
private boolean flag = false;
public TutorialThread(SurfaceHolder surfaceHolder, Welcome view) {//构造器
this.surfaceHolder = surfaceHolder;
this.view = view;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
Canvas c;
while (this.flag) {
c = null;
try {
// 锁定整个画布,在内存要求比较高的情况下,建议参数不要为null
c = this.surfaceHolder.lockCanvas(null);
synchronized(this.surfaceHolder) {
view.draw(c);
}
} finally {
if (c != null) {
//更新屏幕显示内容
this.surfaceHolder.unlockCanvasAndPost(c);
}
}
try{
Thread.sleep(span);
}
catch(Exception e){
e.printStackTrace();
}
}
}
}
}
第二个是:Loding
package com.test;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class Loading extends SurfaceView implements SurfaceHolder.Callback {
TestActivity testActivity;
SurfaceHolder surfaceHolder;
TutorialThread thread;
Bitmap background2;
Bitmap button2;
public Loading(TestActivity activity1) {
super(activity1);
this.testActivity = activity1;
surfaceHolder = getHolder();
surfaceHolder.addCallback(this);
thread = new TutorialThread(surfaceHolder, this);
initBitmap();
}
private void initBitmap() {
this.background2 = BitmapFactory.decodeResource(getResources(), R.drawable.menu);
this.button2 = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
}
public void draw(Canvas canvas) {
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(background2, 0, 0, null);
canvas.drawBitmap(button2, 250, 350, null);
}
public boolean onTouchEvent(MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
int px = (int)event.getX();
int py = (int)event.getY();
if(px > 250 && px < 250+button2.getWidth()
&& py > 350 && py < 350+button2.getHeight()){//点击了重新游戏按钮
testActivity.myHandler.sendEmptyMessage(2);//向主activity发送Handler消息
}
// testActivity.myHandler.sendEmptyMessage(2);
}
return super.onTouchEvent(event);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
thread.setFlag(true);
thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
thread.setFlag(false);
while (retry) {
try {
thread.join();
retry = false;
}
catch (InterruptedException e) {//不断地循环,直到刷帧线程结束
}
}
// TODO Auto-generated method stub
}
class TutorialThread extends Thread{//刷帧线程
private int span = 500;//睡眠的毫秒数
private SurfaceHolder surfaceHolder;
private Loading view;
private boolean flag = false;
public TutorialThread(SurfaceHolder surfaceHolder, Loading view) {//构造器
this.surfaceHolder = surfaceHolder;
this.view = view;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
Canvas c;
while (this.flag) {
c = null;
try {
// 锁定整个画布,在内存要求比较高的情况下,建议参数不要为null
c = this.surfaceHolder.lockCanvas(null);
synchronized (this.surfaceHolder) {
view.draw(c);
}
} finally {
if (c != null) {
//更新屏幕显示内容
this.surfaceHolder.unlockCanvasAndPost(c);
}
}
try{
Thread.sleep(span);
}
catch(Exception e){
e.printStackTrace();
}
}
}
}
}
第三个是:主TestActivity
package com.test;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.Display;
import android.view.Window;
import android.view.WindowManager;
public class TestActivity extends Activity {
Welcome welcome;
Loading loading;
Process process;
int viewX;
int viewY;
Handler myHandler = new Handler(){//用来更新UI线程中的控件
public void handleMessage(Message msg) {
if(msg.what == 1)
{
if(welcome != null)
{
welcome = null;
}
toLoading();
}
else if(msg.what == 2)
{
if(loading != null)
{
loading = null;
}
toWelcome();
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置为全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//强制为横屏
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
viewX = display.getWidth();
viewY = display.getHeight();
toWelcome();
}
public void toLoading() {
//process = new Process(this);
loading = new Loading(this);
setContentView(loading);
new Thread(){//线程
public void run(){
Looper.prepare();
process = new Process(TestActivity.this);//初始化GameView
Looper.loop();
}
}.start();//启动线程
}
public void toWelcome() {
welcome = new Welcome(this);
setContentView(welcome);
}
}
程序代码就贴这么多吧。。应该可以看得懂了的。