Android游戏开发入门讲解-SurfaceView-1

一、框架核心
SurfaceView
SurfaceView是View的子类,等同于TextView、ImageView等一系列控件。
核心功能可以通过子线程进行界面的绘制.
绘制需要注意的内容:
所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理。
由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surface
SurfaceHolder
对象获取:SurfaceView. getHolder();
用于管理Surface,核心的内容是Callback接口,我们需要依据绘图中提到的注意内容确保Callback中的方法是在UI线程中调用。
Callback的调用:使用SurfaceHolder.addCallback(Callback callback)方法进行调用
Thread


二、界面的绘制
在子线程(Thread)中绘制界面
绘制的周期
SurfaceHolder.Callback.surfaceCreated()—— SurfaceHolder.Callback.surfaceDestroyed() 
一个周期的绘制步骤
SurfaceHolder锁定界面:SurfaceHolder.lockCanvas();
图像绘制(绘制一个矩形,说明当前的坐标系统)
SurfaceHolder解除界面锁定:SurfaceHolder.unlockCanvasAndPost(Canvas canvas);
绘制内容的量决定着绘制时间,在一个时间段内绘制的次数越多那么用户的体验越好。


三、SurfaceView的API介绍

Provides a dedicated drawing surface embedded inside of a view hierarchy. You can control the format of this surface and, if you like, its size; the SurfaceView takes care of placing the surface at the correct location on the screen 
The surface is Z ordered so that it is behind the window holding its SurfaceView; the SurfaceView punches a hole in its window to allow its surface to be displayed. The view hierarchy will take care of correctly compositing with the Surface any siblings of the SurfaceView that would normally appear on top of it. This can be used to place overlays such as buttons on top of the Surface, though note however that it can have an impact on performance since a full alpha-blended composite will be performed each time the Surface changes. 


Access to the underlying surface is provided via the SurfaceHolder interface, which can be retrieved by calling getHolder(). 
The Surface will be created for you while the SurfaceView's window is visible; you should implement surfaceCreated(SurfaceHolder) and surfaceDestroyed(SurfaceHolder) to discover when the Surface is created and destroyed as the window is shown and hidden. 
One of the purposes of this class is to provide a surface in which a secondary thread can render in to the screen. If you are going to use it this way, you need to be aware of some threading semantics: 
1、All SurfaceView and SurfaceHolder.Callback methods will be called from the thread running the SurfaceView's window (typically the main thread of the application). They thus need to correctly synchronize with any state that is also touched by the drawing thread. 
2、You must ensure that the drawing thread only touches the underlying Surface while it is valid -- between SurfaceHolder.Callback.surfaceCreated() and SurfaceHolder.Callback.surfaceDestroyed().
 对应的中文翻译:
SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。

surface是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。surfaceview提供了一个可见区域,只有在这个可见区域内 的surface部分内容才可见,可见区域外的部分不可见。surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者 surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如,文本和按钮等控件)。注意,如果surface上面 有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。


你可以通过SurfaceHolder接口访问这个surface,getHolder()方法可以得到这个接口。


surfaceview变得可见时,surface被创建;surfaceview隐藏前,surface被销毁。这样能节省资源。如果你要查看 surface被创建和销毁的时机,可以重载surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)。
 
surfaceview的核心在于提供了两个线程:UI线程和渲染线程。这里应注意:
1> 所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理。
2> 由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surface。


四、

1、开发游戏
2、移植游戏


看电影
屏幕 SurfaceView
胶片 SurfaceHolder
工作人员 Thread


SurfaceView
1、优点
双缓冲机制
A 显示界面 加载数据
B 加载数据 显示界面
2、缺点
对CPU和内存的开销比较大
注:开发中当SurfaceView不可见的时候立刻回收


---------------------------------------------------------------------
1、通过SurfaceView
拿到SurfaceView
拿到Surface
2、Surface怎么绘制界面
1 Canvas lockCanvas
2 拿到Canvas可以绘制界面
3 unLockCanvas(Canvas canvas);解锁画布 post() or postAll() is called
二合一 unlockCanvasAndPost(Canvas canvas);
3、SurfaceHolder里面也有上面三个方法


五、实例讲解

GameUI.java

package net.dxs.game;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class GameUI extends SurfaceView implements SurfaceHolder.Callback {

	private RenderThread thread;
	private boolean isRender;//线程的开关
	private SurfaceHolder holder;

	public GameUI(Context context) {
		super(context);
		holder = this.getHolder();
		holder.addCallback(this);//保证下面的三个方法有效
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		System.out.println("surfaceCreated");
		thread = new RenderThread();
		isRender = true;
		thread.start();
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
		System.out.println("surfaceChanged");

	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		System.out.println("surfaceDestroyed");
		isRender = false;

	}

	private class RenderThread extends Thread {
		@Override
		public void run() {
			while (isRender) {
				renderGame();
			}
		}

	}

	private void renderGame() {
		//1 Canvas lockCanvas
		Canvas lockCanvas = holder.lockCanvas();
		Paint paint = new Paint();
		paint.setColor(Color.YELLOW);

		//2 拿到Canvas可以绘制界面
		lockCanvas.drawRect(0, 0, 100, 100, paint);

		//3 unLockCanvas(Canvas canvas);解锁画布 post() or postAll() is called
		//二合一 unlockCanvasAndPost(Canvas canvas);
		holder.unlockCanvasAndPost(lockCanvas);
	}
}

在MainActivity.java中调用

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		GameUI gameUI = new GameUI(this);
		setContentView(gameUI);
	}


那么会在手机上绘制出一个矩形黄色小方块








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值