本站提倡有节制游戏,合理安排游戏时间,注意劳逸结合。

【源码超市设计软件】【ffmpeg怎么使用源码】【iapp源码如何制作】surfaceview源码

2024-11-25 05:34:06 来源:焦点 分类:焦点

1.android videoview和surfaceview的区别
2.Android修行手册 - TextureView和SurfaceView的属性方法以及示例
3.自定义View(1)
4.OpenSitUp开源项目:零基础开发基于姿态估计的运动健身APP
5.音视频流媒体开发系列(45)GLSurfaceView源码解析&EGL环境

surfaceview源码

android videoview和surfaceview的区别

       åœ¨Android游戏当中充当主要的除了控制类外就是显示类,在J2ME中我们用Display和Canvas来实现这些,而Google Android中涉及到显示的为view类,Android游戏开发中比较重要和复杂的就是显示和游戏逻辑的处理。

       è¿™é‡Œè¯´ä¸‹android.view.View和android.view.SurfaceView。SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及Camera摄像头一般均使用SurfaceView,到底有哪些优势呢? SurfaceView可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了SurfaceHolder类,使用getHolder方法获取,相关的有Canvas lockCanvas()

       Canvas lockCanvas(Rect dirty) 、void removeCallback(SurfaceHolder.Callback callback)、void unlockCanvasAndPost(Canvas canvas) 控制图形以及绘制,而在SurfaceHolder.Callback 接口回调中可以通过重写下面方法实现。

       ä½¿ç”¨çš„SurfaceView的时候,一般情况下要对其进行创建,销毁,改变时的情况进行监视,这就要用到 SurfaceHolder.Callback.

       class XxxView extends SurfaceView implements SurfaceHolder.Callback {

       public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){ }

       //看其名知其义,在surface的大小发生改变时激发

       public void surfaceCreated(SurfaceHolder holder){ }

       //同上,在创建时激发,一般在这里调用画图的线程。

       public void surfaceDestroyed(SurfaceHolder holder) { }

       //同上,销毁时激发,一般在这里将画图的线程停止、释放。

       }

       å¯¹äºŽSurface相关的,Android底层还提供了GPU加速功能,所以一般实时性很强的应用中主要使用SurfaceView而不是直接从View构建,同时后来做android 3d OpenGL中的GLSurfaceView也是从该类实现。

       SurfaceView和View最本质的区别在于,surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。

       é‚£ä¹ˆåœ¨UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。

       å½“使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步。比如你触屏了一下,你需要surfaceView中thread处理,一般就需要有一个event queue的设计来保存touch event,这会稍稍复杂一点,因为涉及到线程同步。

       æ‰€ä»¥åŸºäºŽä»¥ä¸Šï¼Œæ ¹æ®æ¸¸æˆç‰¹ç‚¹ï¼Œä¸€èˆ¬åˆ†æˆä¸¤ç±»ã€‚

       1 被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。

       2 主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。所以显然view不合适,需要surfaceView来控制。

       3.Android中的SurfaceView类就是双缓冲机制。因此,开发游戏时尽量使用SurfaceView而不要使用View,这样的话效率较高,而且SurfaceView的功能也更加完善。

        考虑以上几点,所以我一直都选用 SurfaceView 来进行游戏开发。

       é‚£ä¹ˆåœ¨ä»¥åŽæºç å®žä¾‹ä¸­ï¼Œéƒ½ä¼šä»¥ç»§æ‰¿sarfaceView框架来进行演示。

Android修行手册 - TextureView和SurfaceView的属性方法以及示例

       欢迎阅读《Android修行手册 - TextureView和SurfaceView的属性方法以及示例》。本文将为您介绍Android开发中SurfaceView与TextureView的核心属性与方法,以及简单示例以加深理解。

       SurfaceView是Android中用于显示图像或动画的组件,主要方法包括:

       surfaceCreated(@NonNull SurfaceHolder holder):当SurfaceView的Surface创建时回调。

       surfaceDestroyed(@NonNull SurfaceHolder holder):当SurfaceView的源码超市设计软件Surface销毁时回调。

       surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height):当SurfaceView的Surface尺寸或格式改变时回调。

       SurfaceHolder.addCallback(context):添加回调方法,包含上述三个回调。

       lockCanvas():获取Canvas对象并锁定画布,进行绘图操作。

       unlockCanvasAndPost():完成画布锁定与提交改变。

       TextureView用于显示和管理SurfaceTexture,其核心方法如下:

       getSurfaceTexture():获取关联SurfaceTexture。

       getBitmap(整型宽度,整型高度):返回关联表面纹理内容的ffmpeg怎么使用源码位图表示。

       getTransform(Matrix transform):返回关联的转换。

       isOpaque():指示视图是否不透明。

       lockCanvas():开始编辑曲面像素。

       setOpaque(boolean opaque):指示内容是否不透明。

       setTransform(Matrix transform):设置关联转换。

       unlockCanvasAndPost(Canvas canvas):完成对曲面像素的编辑。

       监听方法包括:

       onSurfaceTextureAvailable(SurfaceTexture arg0, int arg1, int arg2):创建监听,前提开启硬件加速。

       onSurfaceTextureDestroyed(SurfaceTexture arg0):销毁监听。

       onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1,int arg2):尺寸改变监听。

       onSurfaceTextureUpdated(SurfaceTexture arg0):更新监听。

       示例代码如下:

       Java版本自定义SurfaceView实现

       Kotlin版本自定义SurfaceView实现

       布局文件使用

       示例代码提供了一种简单的使用方法,具体应用还需根据实际项目需求进行扩展,如多图同步、实时更新、iapp源码如何制作动画控制等。

       本文作者:小空,如需转载,请务必保留原文出处。

       更多关于Android、Unity开发技巧、资源分享、网站、工具、素材、源码、游戏等内容,欢迎访问专栏页面。

       关注@空名先生,获取更多技术知识与灵感。起名系统源码

       专栏链接:

       点击跳转->Unity一路向东

       点击跳转->有意思又酷的网站网址

       点击跳转->精致神器软件推荐

       点击跳转->精品书籍图谱

       点击跳转->中国神话联盟宇宙

       点击跳转->Android 指南

自定义View(1)

        经历过前面三篇啰啰嗦嗦的基础篇之后,终于到了进阶篇,正式进入解析自定义View的阶段。

        至于本章节为什么要叫进阶篇(虽然讲的是基础的内容),因为从本篇开始,将会逐渐揭开自定义View的神秘面纱,每一篇都将比上一篇内容更加深入,利用所学的知识能够制作更加炫酷自定义View,就像在台阶上一样,每一篇都更上一层, 帮助大家一步步走向人生巅峰,出任CEO,赢取白富美。 误,是帮助大家更加了解那些炫酷的自定义View是如何制作的,达到举一反三的效果。

        作为一个<b>有(hui)追(zhuang)求(B)</b>的程序员,肯定想做一些让人眼前一亮的程序效果,但是系统提供的那些一般很难满足,为了<b>梦(zhuang)想(B)</b>就必须要学习一些自定义View。下面我们就了解一些自定义View相关的东西。

        自定义ViewGroup一般是利用现有的组件根据特定的布局方式来组成新的组件,大多继承自ViewGroup或各种Layout,包含有子View。

        例如:一个应用内的底部导航条中的条目,一般都是上面为图标,下面是文字,那么这两个就可以用自定义ViewGroup组合成为一个Veiw,提供两个属性分别用来设置文字和图片即可,这样使用起来会方便很多。

        在没有现成的View,需要自己实现的时候,就使用自定义View,一般继承自View,SurfaceView或其他的View,不包含子View。

        例如:定义一个支持自动加载网络图片的ImageView,或制作一种特殊的动画效果。

        <b>一般来说,自定义View在大多数情况下都有替代方案,利用图片或者组合动画来实现,但是使用后者可能会面临内存耗费过大,制作麻烦更诸多问题。</b>

        View的构造函数有四种重载分别如下

        可以看出,关于View构造函数的参数有多有少,先排除几个不常用的,留下常用的再研究。

        <b>有四个参数的构造函数在API的时候才添加上,我一般不使用,暂不考虑。</b>

        有三个参数的构造函数中第三个参数是默认的Style,这里的默认的Style是指它在当前Application或Activity所用的Theme中的默认Style,且只有在明确调用的时候才会生效,以系统中的ImageButton为例说明:

        <b>注意:即使你在View中使用了Style这个属性也不会调用三个参数的构造函数,所调用的依旧是两个参数的构造函数。</b>

        <b>由于三个参数的构造函数第三个参数一般不用,暂不考虑,第三个参数的具体用法会在以后用到的时候详细介绍。</b>

        排除了两个之后,只剩下一个参数和两个参数的构造函数,他们的详情如下:

        以下方法调用的是<b>一个参数</b>的构造函数:

        以下方法调用的是<b>两个参数</b>的构造函数:

        关于构造函数先讲这么多,关于如何自定义属性和使用attrs中的内容,在后面会详细讲解,目前只需要知道这两个构造函数在何时调用即可。

        ========

        测量View大小使用的是onMeasure函数,我们可以从这两个参数取出宽高的相关数据:

        从上面可以看出 onMeasure 函数中有 widthMeasureSpec 和 heightMeasureSpec 这两个 int 类型的参数, 毫无疑问他们是和宽高相关的, <b>但它们其实不是宽和高, 而是由宽、高和各自方向上对应的模式来合成的一个值:</b>

        在int类型的位二进制位中,-这两位表示模式,~0这三十位表示宽和高的实际值。

        以数值(二进制为: )为例(其中模式和实际数值是连在一起的,为了展示我将他们分开了):

        实际上关于上面的东西了解即可,在实际运用之中只需要记住有三种模式,用 MeasureSpec 的 getSize是获取数值, getMode是获取模式即可。

        如果对View的宽高进行修改了,<b>不要调用super.onMeasure(widthMeasureSpec,heightMeasureSpec);</b>

        要调用<b>setMeasuredDimension(widthsize,heightsize);</b> 这个函数。

        ======

        这个函数在视图大小发生改变时调用:

        onSizeChanged如下:

        可以看出,它又四个参数,分别为 宽度,高度,上一次宽度,上一次高度。

        这个函数比较简单,我们只需关注 宽度(w), 高度(h) 即可,这两个参数就是View最终的大小。

        =========

        <b>确定布局的函数是onLayout,它用于确定子View的位置,在自定义ViewGroup中会用到,他调用的是子View的layout函数。</b>

        不过关于View的layout函数我们一般无需关注,因为在一般情况下我们只需关注View自身的坐标系即可,除非View状态与在父VIew所处位置相关。

        在自定义ViewGroup中,onLayout一般是循环取出子View,然后经过计算得出各个子View位置的坐标值,然后用以下函数设置子View位置。

        四个参数分别为:

        具体可以参考 坐标系 这篇文章:

        PS:关于onLayout这个函数在讲解自定义ViewGroup的时候会详细讲解。

        ========

        onDraw是实际绘制的部分,也就是我们真正关心的部分,使用的是Canvas绘图。

        关于Canvas绘图另分一章吧,本来想写一些关于Canvas基本操作的的,可是篇幅太长了QAQ, 留个尾巴下一篇再写吧,毕竟Canvas绘图也是一个比较庞大的东西,也不是三言两语就能讲明白的,就到这里吧。

        ======

        自定义完View之后,一般会对外暴露一些接口,用于操作View的相关属性,控制View的状态等,或者需要监听View的变化,具体还是稍后再讲吧(继续挖坑)。

        PS :实际上ViewGroup是View的一个子类。

        View

        ViewGroup

        View.MeasureSpec

        onMeasure,MeasureSpec源码 流程 思路详解

        Android中自定义样式与View的构造函数中的第三个参数defStyle的意义

        android view构造函数研究

        Android View构造方法第三参数使用方法详解

        Android 自定义View onMeasure方法的实现

        Android API指南(二)自定义控件之 onMeasure

        Android中View的绘制过程 onMeasure方法简述

OpenSitUp开源项目:零基础开发基于姿态估计的运动健身APP

       更多深度学习工程实践项目,请关注公众号:DL工程实践

       OpenSitUp是一个基于姿态估计的开源项目,旨在帮助对姿态估计感兴趣的朋友,能够从零开始搭建一个在android手机上运行的仰卧起坐计数APP。这个项目主要解决了如何让计算量较大的人体姿态估计网络流畅的运行在手机端,并实现仰卧起坐的计数功能。掌握了这个项目的原理之后,可以很方便的迁移到类似的运动,健身APP当中。

       项目成果展示了最终的APP效果,在人潮涌动的西湖景区,演示了如何使用该项目进行仰卧起坐计数,效果显著。

       项目目录结构包含多个工程,包括数据采集、odoo源码怎么安装标注、训练、部署、app开发等,整体目录结构清晰。数据集存放目录内有多张标注好的,可用于训练。此外,为项目准备了一个标注工具,方便标注关键点,还有基于pytorch的关键点训练工具,以及Android上的仰卧起坐计数APP。

       采集的流程包括从网上搜索“仰卧起坐”的视频,下载视频片段并抽取关键帧,以及从网上搜索背景较为丰富的。标注时,使用自开发的标注工具,标注关键点,生成标签文件。算法原理涉及姿态估计(关键点检测)领域,一般采用heatmap输出关键点位置,而非直接回归坐标。

       算法实现包括四个部分:配置文件、数据读取、训练引擎和网络模型。训练完成后,需要将pytorch模型转换为支持手机运行的格式,选择使用ncnn作为推理库。为简化此过程,编写了export_ncnn.py脚本,可以一键将训练出来的模型转换为ncnn模型。

       APP开发包含一个Activity类,两个SurfaceView类,一个Alg类,一个Camera类。Alg类负责调用算法进行推理,Camera类负责摄像头的管理,SurfaceView用于展示摄像头预览和关键点信息,Activity类管理整个APP。具体代码逻辑可以在SiteUpAndroid源码中找到。

音视频流媒体开发系列()GLSurfaceView源码解析&EGL环境

       查看源码的原则:以常用的API为入口,依据地图、带着问题、沿着主线来寻找答案

       从事「音视频领域」开发工作有前途吗?

       GLSurfaceView在使用时,我们调用的两个主要方法是setEGLContextClientVersion和setRenderer。具体操作在渲染回调中执行,包括onSurfaceCreated、onSurfaceChanged和onDrawFrame。

       我们的焦点是EGL和GLThread。

       1.1. setRenderer的实现:检查GLThread的状态,确保只有一个GLThread存在。

       1.2. GLThread实现:这是一个Thread的子类,关键逻辑在guardedRun方法中。

       1.3. guardedRun(渲染核心逻辑):创建EGLSurface,获取GL对象,并在EGLContext和EGLSurface生成并绑定后执行渲染。渲染数据通过eglSwapBuffers显示。

       1.4. EglHelper:提供创建EGLSurface、获取GL对象和交换Framebuffer的方法。

       音视频免费学习资源:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

       整理了一些面试题、学习资料、教学视频和学习路线图共享在群文件,资料涵盖C/C++、Linux、FFmpeg、WebRTC、RTMP等,免费分享,有需要的可以加入群自取。

       TextureView +EGL+ GLThread绘制图形

       将GLSurfaceView内容简化,剔除SurfaceView继承,保留GL环境,使用GLEnvironment进行渲染。借鉴了[GLSurfaceView的简单分析及巧妙借用]的思路,避免了从头开始实现GL环境的复杂过程。

       通过实践,了解了GLSurfaceView内部机制、EGLThread的实现和EGL上下文的意义。在TextureView基础上创建EGL上下文和GLThread以实现OpenGL的绘制。

       感谢阅读。

相关推荐
一周热点