您的位置:首页 > 移动开发 > Android开发

Android SurfaceView绘制

2013-09-27 16:02 295 查看
MainActivity 作为主界面,平时的Android工程用Layout作为mainActivity的界面布局,这里用SurfaceView 来绘制界面作为界面显示。

在MainActivity中通过 this.setContentView(gameView);  设置SurfaceView为主界面显示。

MainActivity源码:

package com.example.surfaceview;

import android.os.Bundle;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.view.Menu;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity {

MySurfaceView gameView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);

requestWindowFeature(Window.FEATURE_NO_TITLE);

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

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

gameView=new MySurfaceView(this);

this.setContentView(gameView);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}


如何设置为全屏,横屏?

requestWindowFeature(Window.FEATURE_NO_TITLE);

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

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


gameView=new MySurfaceView(this);


这里引用了MySurfaceView来创建一个SurfaceView作为mainAcvity界面显示。

MySurfaceView是继承自SurfaceView的,并且实现了 SurfaceHolder.Callback 接口。

在MySurfaceView中画了一张图片。

package com.example.surfaceview;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

//implements实现接口
//extends 继承类

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {

MainActivity activity;					//activity 引用
Paint paint;									//画笔引用
DrawThread drawThread;			//绘制线程引用
Bitmap bgBmp; 						//背景图片

Bitmap bulletBmp;				//炮弹位图

public MySurfaceView(MainActivity activity)
{
super(activity);
this.activity = activity;
this.requestFocus();		//获取焦点
this.setFocusableInTouchMode(true);	//设置为可触控
getHolder().addCallback(this);				//注册回调接口

}

@Override
protected void onDraw(Canvas canvas)	//绘制界面
{
super.onDraw(canvas);

canvas.drawBitmap(bgBmp, 0, 0,paint);

}

@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

paint=new Paint();			//创建画笔
paint.setAntiAlias(true);	//打开抗锯齿

bgBmp=BitmapFactory.decodeResource(this.getResources(), R.drawable.lol);

drawThread = new DrawThread(this);//创建绘制线程
drawThread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
drawThread.setFlag(false);   //停止绘制
}

}


在SurfaceView 构造器内,设置了可点击、获取焦点、

在SurfaceView创建之时,创建了画笔,打开抗锯齿。然后加载图片资源、创建绘制线程、开始绘制。

进入到  DrawThread 线程绘制 。

package com.example.surfaceview;

import android.R.integer;
import android.graphics.Canvas;
import android.view.SurfaceHolder;

public class DrawThread extends Thread {
private boolean flag=true;
private int sleepSpan = 100;
MySurfaceView gameView;  //父界面引用
SurfaceHolder surfaceHolder; //surfaceHolder引用

public DrawThread(MySurfaceView gameView)
{
this.gameView = gameView;
this.surfaceHolder = gameView.getHolder();  //
}

public void run()
{
Canvas canvas;
while(this.flag)
{
canvas=null;
try {
canvas=this.surfaceHolder.lockCanvas(null);//锁定画布
synchronized (this.surfaceHolder)
{
gameView.onDraw(canvas);
}
}
finally
{
if(canvas!=null)
{
this.surfaceHolder.unlockCanvasAndPost(canvas);  //释放锁
}
}

try
{
Thread.sleep(sleepSpan);   //线程指定休眠
}
catch (Exception e) {
// TODO: handle exception
e.printStackTrace();     //打印错误堆栈信息
}

}
}

public void setFlag(boolean flag)   //设置工作标志位的方法
{
this.flag=flag;
}

}


通过一个while循环,不停的执行gameView.onDraw() 来绘执行SurfaceView的onDraw()进行界面绘制。并且设置睡眠100ms。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐