AndroidSurfaceView基础⽤法详解
Android 游戏开发框架核⼼组件
核⼼组件介绍
SurfaceView 介绍
1. SurfaceView 介绍 SurfaceView 就是带 Surface 的 view,它是⼀个 View,是 View 的⼦类,所以和其他 View ⼀样,可
以在屏幕上展⽰东西接收⽤户输⼊,具有 View 的⽣命周期回调函数,如 onMeasure、onLayout、onDraw、
onTouchEvent 等
2. SurfaceView 带有独⽴的 Surface(独⽴与 window 的 surface),这可以让⼦线程在独⽴的 Surface 上⾯绘制东西,进
⾏ SurfaceView 的界⾯绘制,这个⼦线程就叫做渲染线程,但是要让独⽴的 Surface 上⾯的东西在 View 上⾯展⽰出来,需要 post ⼀个消息给主线程,⽬的是把该 Surface 中 canvas 上的东西绘制到 View 的真正的画布上⾯(window 的surface 的 canvas上),这样就可以把 UI 线程空闲出来处理⽤户的交互
3. Surface 可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated() 和 SurfaceHolder.Callback.surfaceDestroyed()
之间有效,这只是说 Surface 创建和销毁的时候会回到前⾯两个⽅法,所以要确保渲染线程访问的是合法有效的 surface 4. SurfaceHolder.CallBack 是通过 SurfaceView 的 SurfaceHolder 的 addCallback 来设置给 SurfaceHolder 的,让
SurfaceView 实现 CallBack 并设置给 SurfaceHolder,SurfaceView 就可以监听这个独⽴ Surface 的创建和销毁了。sdk 中的介绍
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。
SurfaceHolder 介绍
SurfaceHolder 是对 SurfaceView 的 Surface 的包装,不但在 SurfaceHolder.callback 接⼝中负责 Surface 创建和销毁的回调,⽽且还对 Surface 的关键⽅法 LockCanvas()、unLockCanvasAndPost()⽅法进⾏了线程安全的包装,所以SurfaceHolder 是 Surface 对象的持有者,负责 Surface 的⽣命周期中的对 Surface 操作的⽅法的调⽤
脏矩形 Rect dirty,是指标记这块矩形区域的数据作废,也就是需要重写绘制的矩形区域,LockCanvas(Rect dirty),可以指定⼀个矩形区域,让 Surface 中的 Canvas 上部分数据重绘。
SurfaceView、SurfaceHolder、Surface 之间的关系
SurfaceView 使⽤的步骤
1. 获取到 SurfaceView 对应的 SurfaceHolder,给 SurfaceHolder 添加⼀个 SurfaceHolder.callback 对象。
2. 创建渲染线程对象
3. 在⼦线程中开始在 Surface 上⾯绘制图形,因为SurfaceView没有对我们暴露 Surface,⽽只是暴露了 Surface 的包装器
SurfaceHolder,所以使⽤ SurfaceHolder 的 lockCanvas()获取 Surface 上⾯指定区域的 Canvas,在该 Canvas 上绘制图形,绘制结束后,使⽤ SurfaceHolder 的 unlockCanvasAndPost()⽅法解锁 Canvas,并且让 UI 线程把 Surface 上⾯的东西绘制到 View 的 Canvas 上⾯
SurfaceView 使⽤的 demo
view ui框架public class GameUI extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holder;
private RenderThread renderThread;
private boolean isDraw = false;// 控制绘制的开关
public GameUI(Context context) {
super(context);
holder = Holder();
holder.addCallback(this);
renderThread = new RenderThread();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
isDraw = true;
renderThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
isDraw = false;
}
/
**
* 绘制界⾯的线程
*
* @author Administrator
*
*/
private class RenderThread extends Thread {
@Override
public void run() {
// 不停绘制界⾯
while (isDraw) {
drawUI();
}
super.run();
}
}
/**
* 界⾯绘制
*/
public void drawUI() {
Canvas canvas = holder.lockCanvas();
try {
drawCanvas(canvas);
} catch (Exception e) {
e.printStackTrace();
} finally {
holder.unlockCanvasAndPost(canvas);
}
}
private void drawCanvas(Canvas canvas) {
// 在 canvas 上绘制需要的图形
}
}
到此这篇关于Android SurfaceView基础⽤法详解的⽂章就介绍到这了,更多相关Android SurfaceView基础内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论