位置: 编程技术 - 正文

android游戏之SurfaceView(android su)

编辑:rootadmin

推荐整理分享android游戏之SurfaceView(android su),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android su,android的游戏,surf apk android,android game,surf安卓版,android rpg游戏,surf apk android,android的游戏,内容如对您有帮助,希望把文章链接给更多的朋友!

前言:上个月才大体了解SurfaceView现在回来看又忘了,真的应该好好写写博客,避免重复解决相同的问题,android给我们提供了一个类SurfaceView,这个类多用在游戏开发中,用于刷新游戏画面,性能比直接重写View.onDraw()好.

简要介绍:

  surfaceView的设计目的是提供可以通过子线程把画面传递给屏幕的Surface,通过子线程来绘制画面,不阻塞主线程,平常的View都是主线程绘制的,使用的时候最好懂得一些线程的知识.

  从SurfaceView源码的API中可以看到SurfaceView继承自View,并有一个重要的数据成员Surface,可以控制Surface的&#;式(format)和大小(size),Surface是一个纵深宽的,它总在SurfaceView窗口的后面,SurfaceView在自己的窗口上打一个洞使得Surface能够被看到,SurfaceView通过分层关心Surface得组合(我觉得这与双缓冲有关),

访问SurfaceView的在下面的Surface可以通过getHolder()得到SurfaceHolder,然后使用使用getSurface()得到Surface

SurfaceView的窗口看得见的时候就开始创建Surface,通过实现SurfaceHolder的SurfaceCreated和SurfaceDestroyed来实现当窗口展现或影藏时Surface的创建与销毁,

应注意:

一 所有的SurfaceView和SurfaceHolder.callback都应该在主线程(UI线程)中调用,绘制画面的子线程所要访问的变量应该做同步处理

二 必须保证绘制画面的子线程是在底面的Surface(从双缓冲机制可以理解为是正在绘制的画面)的有效时间(在SurfaceCreated和SurfaceDestroyed之间)内访问

SurfaceView框架介绍:

  在SurfaceView的构造函数中有一个init(),init()里面调用setWillNotDraw(true)来设置画面不是画在SurfaceView身上,而是画在Surface上然后刷新显示在屏幕上,

android游戏之SurfaceView(android su)

  Surface继承View,平常继承View一般都会重写onDraw()方法,但SurfaceView重写draw(),因为View机制里面都会调用该方法来把画面显示在屏幕上,view的draw方法调用给用户画图的接口onDraw(),surfaceView在draw方法中使用canvas.drawColor(0, PorterDuff.Mode.CLEAR);来打一个洞使得可以看到底面的Surface

  SurfaceView提供一个接口SurfaceHolder来供开发者调用,前面讲到通过getHolder来得SurfaceHolder从而控制Surface,现在看一下SurfaceView中的SurfaceHolder,SurfaceHolder作为SurfaceView的一个私有终态数据成员存在,看一下SurfaceHolder的实现可以知道里面得一些方法:addCallback(),removeCallback(),这两个方法在使用的时候都对ArrayList<Callback>mCallbacks进行同步处理,还有setFixedSize()设置不变的尺寸,setFormat设置像素&#;式,还有lockCanvas把画廊Canvas锁住,还有lockCanvasAndPost把canvas贴到Surface上并释放Canvas,通过看源码可以知道SurfaceHolder对Canvas的操作都是调用Surface对Canvas操作,

  SurfaceView是通过updateWindow来刷新窗口和界面的,可以看到调用updateWindow的函数有Handler.HandleMessage(),以及ViewTreeObserver.OnScrollChangedListener(),ViewTreeObserver.OnPreDrawListener(),onWindowVisibilityChanged,setFrame,handleGetNewSurface,可以知道窗口在什么时候会被更新,

  再看一下updateWindow里面的实现方式,通过调用

callbacks = getSurfaceCallbacks();for (SurfaceHolder.Callback c : callbacks) {c.surfaceDestroyed(mSurfaceHolder);},在不同得场合调用Callbacks里面的surfaceChanged, surfaceCreated,surfaceDestroyed,那这样的话我们就只需要实现Callbacks里面的三个方法来操作SurfaceView的Surface就行了,

SurfaceView操作介绍

  通过实现SurfaceHolder.Callbacks的三个方法来对SurfaceView的Surface进行操作,注意在系统调用updateWindow()函数前调用getHolder.addCallback(),可以在构造函数中调用,不要在实现的三个方法中调用,

由于向屏幕展示东西都是通过传递Canvas,而Surface里有对Canvas的操作,SurfaceView提供SurfaceHolder来操作Surface间接操作Canvas,这样更安全,因此我们要对Canvas操作只需要SurfaceHolder的接口就行了,在继承的三个函数里面都传过来SurfaceView的SurfaceHolder指针,因此对该指针操作就行了,要得到Canvas可以通过surfaceHolder.lockCanvas(),但是我建议先通过getHolder来保存SurfaceHolder指针,再在三个函数里面对保存的指针进行操作,这样访问速度会提升一倍,节约接口动态查找的那一段时间,

电子书全地址 全系列下载地址

[置顶] android项目大全,总有你所需的 注:打开请贴网址,有些直接通过链接打开的不正确。1.相对布局实例

cocos2dx3.2 整体概览(四)—— Sprite(精灵) spanstyle=font-family:Arial,Helvetica,sans-serif;background-color:rgb(,,);本来打算场景完了是/spanspanstyle=background-color:rgb(,,);font-family:TimesNewRoman;Layer/spanspans

标签: android su

本文链接地址:https://www.jiuchutong.com/biancheng/371273.html 转载请保留说明!

上一篇:Android 近百个项目的源代码

下一篇:电子书全地址(完本小说 电子书地址)

  • 印花税购买使用要求及印花税会计分录?
  • 财务汽车折旧年限的最新规定2020
  • 上一年的收入少做账了该怎么调
  • 小型微利企业如何计算所得税
  • 预付账款是付没付钱
  • 不含税劳务报酬怎么交税的
  • 企业的房产税节税有哪些方案?
  • 旧机动车交易需要哪些法定证件
  • 纳税人开具发票服务卡到期限了怎么办?
  • 增值税的会计核算
  • 税控盘费用抵减增值税
  • 商品混凝土增值税政策
  • 无票收入如何做账
  • 定额发票2019
  • 残疾人可以给公司带来税收优惠吗
  • 应收账款确认无法收回
  • 企业收到票据时应以什么入账
  • 一般纳税人增值税及附加税费申报表怎么填
  • 代扣代缴境外增值税可以抵扣
  • 查看所有共享文档
  • 酷狗云盘是干什么用的
  • win10教育版用户账户控制怎么取消
  • 如何使用windows10自带杀毒
  • 住宿费和差旅费
  • win10字体有些模糊
  • wan口ip地址和lan口ip地址不能
  • thinkphp5开发教程
  • 如何设置电脑从硬盘启动
  • php options
  • paytime.exe - paytime是什么进程 有什么用
  • php常用设计模式(大总结)
  • 租金收入计入收入总额吗
  • 在建工程完工后不转固定资产
  • 固定资产后续支出资本化和费用化
  • 运输发票的抵扣税率
  • 阿巴拉契亚国家步道的英文怎么说
  • 公司给员工付个税怎么算
  • php数组变字符串
  • 小程序unload
  • phpcms文档
  • 附加税减免申报表怎么填
  • 外币报表折算差额会计分录
  • 现金支付的现状
  • 账本印花税怎么申报缴纳
  • python中的split函数
  • 公司法人的车租给公司怎么开发票
  • 社保工伤保险可以退吗
  • 车到4s店后还需办什么手续
  • 经审计的财务报表是否要会计师事务所盖章
  • 待转销项税额转出
  • 员工工作服扣款
  • 当月开具的专票可以当月抵扣吗
  • 会计损益类科目有哪些,期末如何结转?
  • 一般纳税人拿到普票怎么处理账务
  • 资产评估资产如何入帐
  • 未完施工是存货吗
  • 税金及附加科目余额在借方还是贷方
  • 工程款打入个人账户扣税吗
  • 在途物资和材料采购的区别
  • xp windows功能在哪里
  • 上帝模式使用教程
  • win10在哪里更改软件大小
  • window7iis配置步骤
  • 基于jquery的表单验证插件
  • js组件是什么
  • shell中执行mysql命令
  • python搜索引擎网络爬虫
  • 网站检测系统
  • ubuntu如何以root用户运行
  • javascript常用函数大全
  • python计算π值
  • 纳税工会经费申请怎么写
  • 吉林省残疾人保障金减免政策
  • 云南税务查询系统
  • 新疆干部在线网络平台登录
  • 企业吸收合并资质
  • 红字发票税务局不愿意退税怎么处理
  • 分类所得税和综合所得税的优缺点
  • 电子税务局官网湖南省
  • 我国税务师事务所有哪些
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设