View 和surfaceView

来源:互联网 发布:office2013激活软件 编辑:程序博客网 时间:2024/05/13 10:44

Android游戏开发中,常用的视图有View,SurfaceView和GLSurfaceView他们的关系是:

GLSurfaceView ------->SurfaceView--------->View,其中GLSurfaceView是专用于3D游戏开发的视图

1、View

一般自定义View继承与View,重写View中的方法,最重要的重写onDraw

<span style="font-size:18px;">package com.example.game_base0;import android.R.integer;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;public class MyView extends View {private int textX=50,textY=50;public MyView(Context context) {super(context);setFocusable(true);setFocusableInTouchMode(true);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {return super.onKeyDown(keyCode, event);}@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {return super.onKeyUp(keyCode, event);}@Overridepublic boolean onTouchEvent(MotionEvent event) {setFocusableInTouchMode(true);int x=(int) event.getX();int y=(int) event.getY();if(event.getAction()==MotionEvent.ACTION_CANCEL){textX=x;textY=y;}else if(event.getAction()==MotionEvent.ACTION_MOVE){textX=x;textY=y;}else if(event.getAction()==MotionEvent.ACTION_UP){textX=x;textY=y;}invalidate();return true;}@Overrideprotected void onDraw(Canvas canvas) {//创建画笔Paint paint=new Paint();//设置画笔颜色paint.setColor(Color.RED);paint.setTextSize(30);//绘制文本canvas.drawText("I", textX, textY, paint);paint.setColor(Color.BLUE);canvas.drawText("Love", textX, textY+50, paint);paint.setColor(Color.LTGRAY);canvas.drawText("YOU,", textX, textY+100, paint);paint.setColor(Color.WHITE);canvas.drawText("YOU", textX, textY+150, paint);paint.setColor(Color.MAGENTA);canvas.drawText("Known", textX, textY+200, paint);paint.setColor(Color.GREEN);canvas.drawText("?", textX, textY+250, paint);super.onDraw(canvas);}}</span>

<span style="font-size:18px;">package com.example.game_base0;import android.os.Bundle;import android.app.Activity;import android.graphics.Color;import android.view.Menu;import android.view.Window;import android.view.WindowManager;public class Main extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);/*//隐去标题栏this.requestWindowFeature(Window.FEATURE_NO_TITLE);*///隐去状态栏this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);MyView  myView=new MyView(this);myView.setBackgroundColor(Color.BLACK);setContentView(myView);}}</span>

因为要给View设置监听,所以必须把View设置为焦点,setfocusable(true)

重绘画布的两个方法:invalidate()和postInvalidate()

2、SurfaceView

在重写SurfaceView时,没有重写onDraw(),使用SurfaceView时,并不会与surfaceView直接打交道,而是通过SurfaceHolder来控制,通过SurfaceHolder可以获得Canvas,通过canvas绘制内容

因为SurfaceView的绘图方法是自己的定义的,所以刷屏需要自己写,所谓的刷屏,我认为:就是覆盖原有的图片

常见的有以下几种方法

1、在画布上填充一种颜色

<span style="font-size:18px;">private void myDraw() {Canvas canvas=sfh.lockCanvas();canvas.drawColor(Color.BLACK);paint.setTextSize(60);canvas.drawText("Game", textX, textY, paint);sfh.unlockCanvasAndPost(canvas);}</span>

2、在每次画图前,绘制一张等同于屏幕大小的图形覆盖在画布上

<span style="font-size:18px;">private void myDraw() {Canvas canvas=sfh.lockCanvas();//canvas.drawColor(Color.BLACK);paint.setColor(Color.WHITE);canvas.drawRect(0, 0, this.getWidth(), this.getHeight(), paint);paint.setTextSize(60);paint.setColor(Color.BLUE);canvas.drawText("Game", textX, textY, paint);sfh.unlockCanvasAndPost(canvas);}</span>

注意下,画笔的颜色设置

3、每次绘图前,指定RGB来填充画布,

我感觉就是第一种方法

只是调用的方法不同而已

canvas.drawRGB(r, g, b)

(4)每次绘图前绘制一张等同于屏幕大小的图片覆盖在画布上

<span style="font-size:18px;">package com.example.game_base1;import android.R.integer;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;public class MySurfaceView extends SurfaceView implements Callback {private SurfaceHolder sfh;private Paint paint;private int textX=100,textY=100;public MySurfaceView(Context context) {super(context);//实例化surfholdersfh=this.getHolder();//为surfholder添加监听sfh.addCallback(this);//实例化画笔paint=new Paint();paint.setColor(Color.WHITE);setFocusable(true);}@Overridepublic boolean onTouchEvent(MotionEvent event) {textX=(int) event.getX();textY=(int) event.getY();myDraw();return true;}@Overridepublic void surfaceCreated(SurfaceHolder holder) {myDraw();}private void myDraw() {Canvas canvas=sfh.lockCanvas();canvas.drawColor(Color.BLACK);paint.setTextSize(60);canvas.drawText("Game", textX, textY, paint);sfh.unlockCanvasAndPost(canvas);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stub}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stub}}</span>

顺便说下全屏的一些设置

隐去标题栏

用程序实现
this.requestWindowFeature(Window.FEATURE_NO_TITLE);

隐去状态栏
his.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

用配置文件实现

隐去标题

android:theme="@android : style/Theme.NoTitleBar"

隐去状态栏

android:theme="@android : style/Theme.NoTitleBar。Fullscreen"





 

0 0
原创粉丝点击