Android(SurfaceView基础用法详解)

这篇文章主要介绍了Android SurfaceView基础用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

Android,SurfaceView基础用法详解,久久派带你了解更多相关信息。

Android 游戏开发框架核心组件

Android(SurfaceView基础用法详解)

核心组件介绍

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 之间的关系

Android(SurfaceView基础用法详解)

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

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 = this.getHolder();        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基础内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/14180.html

(1)
nan
上一篇 2021-08-17
下一篇 2021-08-17

相关推荐

  • 奔驰c220价格是多少(奔驰220多少钱一台)

    【新车迷】在2021年慕尼黑车展上,我们看到了许多奔驰纯电动新车,包括EQB、EQE、EQS、EQG等,但是并非所有梅赛德斯-奔驰新车型都是电动汽车。2022款奔驰C级全地形车在慕尼黑车展上展出,这款C级旅行车(C-ClassAll-Terrain

    2022-01-13 热点头条
    0
  • 不足半年完成两轮融资,DPU芯片设计企业中科驭数宣布完成A+轮融资

    12月21日消息,DPU芯片设计企业中科驭数近日宣布完成数亿元规模A+轮融资,距离该企业完成A轮融资,仅过去了不足半年。本轮融资由麦星投资和昆仑资本联合领投。麦星投资是大疆创新的A轮机构投资人,也是在科创板登陆的“非洲手机之王”——传音控股背后为数不

    2022-01-14
    0
  • 2021异地执行老赖怎么处理(后果很严重)

    有不少网友询问,2021异地执行老赖怎么处理?其实后果很严重,详细情况跟小编一起去看看吧

    2021-09-01
    0
  • 离婚后户口没迁出可以再婚吗

    法律问题分析:离婚户口未迁出直接可以再婚。离婚后女方户口的处理方式:1、另立门户。由于户口政策各地规定多有不同,另立户口的条件也会因时因地而异。一般情况下,需要有独立的房产,并符合当地公安局户籍管理部门的条件方能办理。如果是诉讼离婚或者调解离婚,还需

    2022-01-08
    0
  • 10号发工资的公司怎么样(常见企业发薪日的三个时间段)

    摘要:规模较大、管理较规范的企业,发薪日多在次月10日之前。这些公司大多为高科技公司、上市公司、外资公司或是国企,规模比较大,福利待遇也很好,而且制度方面都很完善,不仅仅是高薪,神马过节福利、加班补助、高温费、带薪年假、年终奖啥的,统统都会有。

    2023-04-14
    0
  • 深圳一大厦有振动?官方:疏散居民,有关原因正在调查中 !

    据深圳龙岗发布,5月18日23时30分许,龙岗街道百富兴大厦居民报警称楼体有异响和振动。接报后,市、区相关部门及街道办立即赶赴现场处置。该楼栋居民已全部安全疏散。相关部门组织专家第一时间启动房屋结构风险监测及安全评估,有关原因正在调查中。所以,大家一定要注意自身安全,尤其住在老旧房屋的居民,平时也要

    热点头条 2023-05-19
    0

发表回复

登录后才能评论