因此SurfaceView的UI可以在一个独立的线程中进行绘制。由于不会占用主线程资源,因此SurfaceView可以实现复杂而高效的UI。...Android应用程序窗口需要请求SurfaceFlinger服务创建绘图表面(也就是Surface对象),同时窗口还需要被WindowManagerService管理;所以实际上窗口的绘图表面是通过两个...Surface对象来描述,一个是应用程序进程创建的,另一个是由WindowManagerService创建的,这两个Surface对象对应于SurfaceFlinger服务的同一个Layer对象。...在应用程序进程这一侧,每一个应用程序窗口,如Activity,都有一个Surface对象,就是在ViewRootImpl对象的mSurface属性,这个Surface用来绘制应用程序窗口的UI,如下ViewRootImpl...draw()方法中主要把SurfaceTexture中收到的图像数据作为纹理更新到对应的HardwareLayer中。
做 Android、iOS、前端、Flutter 的同学一定都用过 Canvas,在各自的平台中 Canvas 就是一个比较上层的图形图像渲染框架。 ?...可运行的代码可以在learning-opengl这里找到,图中的代码只是关键步骤。我这里也只是讲解 OpenGL 的运行方式,更具体的代码使用还需要读者去前面的网站中学习。...4.图中代码片段1就是通过 CPU 将 GLSL 的代码编译成 GPU 指令 5.图中代码片段2是在内存中定义好数据,然后将数据拷贝到 GPU 显存中,在显存中数据是以对象的形式存在的。...下面我们就从第二章中提到的 WsMediaPlayer.draw 方法入手。...这个方法目前还不完善里面只有测试代码,因为我们目前只能播放图像,还没有播放声音,所以目前 current_time_ = current_time = GetRenderPos() 获取到的时间戳,是我构造的测试代码
二、Android绘制机制源码分析 这一章我们来从源码上分析 View 是如何绘制到屏幕上面的,前面的 measure、layout、draw 等等 framework 层的东西我不会着重分析,我主要分析...我想大家应该对这个方法很熟悉,这个方法就是调用 measure、layout、draw 的方法。已经分析烂了的东西这里我就不说了。...图8:SurfaceTexture创建以及使用.png 我将根据图8的流程来讲解 ST 的创建与使用 1.首先我们从 ST.java 的创建开始,也就是图中的黄色方框。...图9:TextureView创建和使用.png 和前面一样,本小节接下来的分析也都是顺着图9来的 1.因为 TV 我们可以将其看成一个普通的 View,所以这里我们可以直接从 TV 的 draw 方法开始分析...从创建到图像流转换的源代码都解析完了,剩下的就是 Android绘制机制 中讲的那样使用 GL 进行真正的绘制了。
例如,UILabel对象画了一个文本字符串和UIImageView对象绘制图像。 因为视图对象是主要的应用程序与用户交互的方式,他们有许多责任。...视图包含使用UIKit定制内容或核心图形、系统调用视图的draw(_:)方法。该方法的实现负责绘制视图的内容到当前图形上下文,这是系统设置的自动调用该方法之前。...这可以通过调用视图的setNeedsDisplay()或setNeedsDisplay(_:)方法。这些方法让系统知道它应该更新视图在下一次draw的时候。...因为它将等待下一个绘图周期更新视图中,您可以调用这些方法在多个视图同一时间更新他们。...因此,你应该叫UIView类的方法从代码中运行您的应用程序的主线程。这可能不是严格必需是唯一一次在创建视图对象本身,而是所有其他操作应该发生在主线程。
前言 渲染机制是Android操作系统很重要的一环,本系列通过介绍应用从启动到渲染的流程,揭秘Android渲染原理。...Vsync信号 Android在“黄油计划”中引入的一个重要机制就是:vsync,引入vsync本质上是要协调app生成UI数据和SurfaceFlinger合成图像,app是数据的生产者,surfaceflinger...App接收到的vsync信号 应用程序基本架构 Android应用进程核心组成 上图列举了Android应用进程侧的几个核心类,PhoneWindow的构建是一个非常重要的过程,应用启动显示的内容装载到其内部的...应用启动流程图(下文称该图为P0) 进程启动 应用冷启动第一步就是要先创建进程,这跟linux类似C/C++程序是一致的,Android亦是通过fork来孵化应用进程,我们知道Linux fork的子进程继承父进程很多的资源...需要注意的时候Android在5.1引入了renderthread线程,可以讲draw操作从UIThread解放出来,这样做的好处是,UIThread将绘制指令sync给renderthread以后可以继续执行
在26个字母显示的特效程序的时候,自定义的类是继承了android.view.View,需要去重载触摸事件调度函数dispatchTouchEvent()方法,在这个方法中 我们使用了:invalidate...说白了就是注意一点:invalidate不能再线程中直接使用,但是可以在UI线程中直接使用,postinvalidate可以直接在线程中使用 我们在应用程序中类是继承View的,它就是一个UI线程,那么它就可以直接使用了...你只需在Activity中显式地调用View对象中的invalidate()方法即可。系统会自动调用 View的onDraw()方法。...这时候你需要创建一个继承了android.os.Handler的子类,并重写handleMessage(Message msg)方法。...关于View的机制 这里推荐一篇文章,写的蛮好:Android中View绘制流程以及invalidate()等相关方法分析 2.已经存在的数据库文件如何放在资源文件下,直接看图吧 调用它的时候:
myView.setAlpha(0.5f) TextureView的继承层次如下图所示: 从类图中可以看到,TextureView继承自View,它与其它的View一样在View hierachy...TextureView重载了draw()方法,其中主要把SurfaceTexture中收到的图像数据作为纹理更新到对应的HardwareLayer中。...SurfaceView 应用程序的视频或者opengl内容往往是显示在一个特别的UI控件中:SurfaceView。SurfaceView的工作方式是创建一个置于应用窗口之后的新窗口。...这种方式的效率非常高,因为SurfaceView窗口刷新的时候不需要重绘应用程序的窗口(android普通窗口的视图绘制机制是一层一层的,任何一个子元素或者是局部的刷新都会导致整个视图结构全部重绘一次,...实例 例如,下面是使用MediaPlayer和TextureView实现视频播放的实例。注意TextureView中的draw方法和onDraw方法都是被定义成final的,不能被子类覆盖。
从资源中获取位图 可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图。...以上方法在编程的时候可以自由选择,在Android SDK中说明可以支持的图片格式如下:png (preferred), jpg (acceptable), gif (discouraged),和bmp...和restore onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布。...在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢? ? save:用来保存Canvas的状态。...如图2所示: 从这两个图中,我们就能看到圆圈位置的明显差异。不进行Canvas的save和restore操作的话,所有的图像都是在画布旋转90°后的画布上绘制的。
从storyboard加载视图后,创建一个上下文并将其设置为视图的上下文属性的值。 GLKit视图会自动创建和配置自己的OpenGL ES帧缓冲区对象和渲染缓冲区。...,比例因子和可绘制属性(如果需要)创建帧缓冲区对象和渲染缓冲区, 将帧缓冲区对象绑定为绘图命令的当前目标 设置OpenGL ES视口以匹配帧缓冲区大小 绘图方法返回后,视图: 解决多重采样缓冲区(如果启用了多重采样...您也可以在单个渲染上下文中创建多个帧缓冲区对象。 您可能会这样做,以便您可以在多个帧缓冲区之间共享相同的渲染管线和OpenGL ES资源。...在大多数情况下,配置帧缓冲区的不同之处在于哪个对象连接到帧缓冲区对象的颜色附着点: 要将帧缓冲区用于离屏图像处理,请附加渲染缓冲区。 请参阅创建离屏帧缓冲区对象。...多重采样使用更多的内存和片段处理时间来渲染图像,但与使用其他方法相比,它可以以更低的性能成本提高图像质量。 下图显示了多采样如何工作。您的应用程序不会创建一个帧缓冲区对象,而是创建两个。
Buffer dst) 将当前位图像素内容复制到一个Buffer缓冲区 我们看到创建位图对象createBitmap包含了6种方法在目前的Android 2.1 SDK中,当然他们使用的是API Level...作为Bitmap对象的I/O类,BitmapFactory类提供了丰富的构造Bitmap对象的方法,比如从一个字节数组、文件系统、资源ID、以及输入流中来创建一个Bitmap对象,下面本类的全部成员,...从J2ME MIDLET时我们就知道Java提供了Canvas类,而目前在Android平台中,它主要任务为管理绘制过程,The Canvas class holds the "draw" calls...今天我们继续介绍Android平台底层绘图类的相关内容,在Android UI开发专题(一) 之界面设计中我们介绍了有关Android平台资源使用以及Bitmap相关类的操作,接下来将会以实例的方式给大家演示各种类的用处以及注意点...final boolean isBold() final boolean isItalic() 该类的创建方法还有从apk的资源或从一个具体的文件路径,其具体方法为 static Typeface createFromAsset
Context在Android系统中的地位很重要,它几乎无所不能,但它也不是你想用就能随便用的,谨防使用不当引起的内存问题。...Android程序不像Java程序一样,随便创建一个类,写个main()方法就能运行,Android应用模型是基于组件的应用设计模式,组件的运行要有一个完整的Android工程环境,在这个环境下,Activity...它是一个抽象类,它的执行被Android系统所提供。它允许获取以应用为特征的资源和类型,是一个统领一些资源(应用程序环境变量等)的上下文。...就是说,它描述一个应用程序环境的信息(即上下文);是一个抽象类,Android提供了该抽象类的具体实现类;通过它我们可以获取应用程序的资源和类(包括应用级别操作,如启动Activity,发广播,接受Intent...上图中的YES和NO我也不再做过多的解释了,这里我说一下上图中Application和Service所不推荐的两种使用情况。
OpenGL提供了一套标准的函数和接口,使开发人员能够在各种操作系统上创建高性能的图形应用程序,这些操作系统包括Windows、Linux、macOS和一些嵌入式系统。...娱乐和多媒体应用:通过OpenGL ES,开发者可以创建高质量的娱乐和多媒体应用,包括图像和视频编辑应用,艺术创作工具等。...初始化OpenGL使用的类是GLSurfaceView,它可以处理OpenGL初始化过程中比较基本的操作,如配置显示设备,在后台线程中渲染,渲染是在显示设备中一个称为surface的特定区域完成的。...在使用GLSurfaceView的时候,我们要处理好Activity生命周期事件,在Activity暂停的时候要释放资源,在Activity恢复的时候要重新恢复资源。 ...,它里面有三个方法需要实现: onSurfaceCreated:当surface被创建的时候,GLSurfaceView会调用这个方法,这发生在应用程序第一次运行的时候,并且当设备被唤醒或者用户从其他Activity
怎么创建和使用它们?在这一系列文章中,我将会探讨这些问题并解释为什么在你的应用中应该大量地使用矢量资源(vector assets)以及怎样最大限度地使用它们。...例如, Google I/O app 在 这次提交 中通过将一些 PNG 图标从位图转换成矢量图,节约了 482 KB。尽管听上去不是很多,但这仅仅是对小图像而言;更大的图片(如插图)会节省更多。...权衡 矢量确实也有一些需要考虑的缺点: 解码 正如前面所诉,矢量图像描述了自己包含的内容,因此在使用前需要对它们进行 inflate 和 draw 操作。 ?...第二个 视口 大小定义虚拟画布,或者定义所有后续绘制命令的空间坐标。固有和视口尺寸可以不同(但应该以相同的比例)— 如果你需要,可以在 1*1 画布中定义矢量。...阅读我们的下一篇文章,了解更多信息: 即将到来: 绘制路径 即将到来: 创建Android矢量资源 即将到来: 在 Android 应用中使用 vector assets 即将到来:分析 Android
所以在在设计类的时候我们将draw的方法设置成可以让子类复写就可以了,你不满意我的实现?...如果随机标识是true,那么x坐标将是0 ~ ScreenWidth中的任意值。那么不是随机的呢?在我的实现中,同一类Shape将会被分为两类,一类常量组。...流程图 其中draw(canvas)是父类的方法,对供外部调用的方法,在isInUse标识位为false时对Shape进行初始化操作,具体的就是调用initStyle()方法,而wtc()则会在initStyle...因为16ms一帧的绘制速度就足够了,不需要绘制太快浪费资源。 这里可以看到我创建了一个Java的Object对象,主要是因为Kotlin本身对于一些并发原语支持的并不好。...Kotlin中任何对象都是继承与Any,Any并没有wait、notify等方法,所以这里用了黑科技……创建了Java对象…… 代码中关键代码绘制调用了WeatherShapePool的drawRain
Drawable可以不含有具体的像素信息,只要它含有的信息足以在draw(canvas)方法中被调用时进行绘制就够了。...2.5 由于Drawable存储的只是绘制规则,因此他在draw()方法被调用前,需要先调用Drawable.setBounds()来为它设置绘制边界。...所以,计算图片占用内存大小的时候,要考虑图片所在的目录跟设备密度,这两个因素其实影响的是图片的宽高,android会对图片进行拉升跟压缩 Bitmap的基本加载 BitmapFactory类提供了四类方法用来加载...比如一个Activity会展示一些用户的头像列表,而如果用户没有设置头像的话,则会显示一个默认头像,而这个头像是位于应用程序本身的资源文件中的。如果有类似上面的场景,就可以对同一Bitmap进行缓存。...如果不进行缓存,尽管看到的是同一张图片文件,但是使用BitmapFactory类的方法来实例化出来的Bitmap,是不同的Bitmap对象。缓存可以避免新建多个Bitmap对象,避免内存的浪费。
ViewRoot类的成员函数performTraversals的详细实现可以参考Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析和Android窗口管理服务WindowManagerService...绘图表面创建一块内存,并且将采集的预览图像数据或者视频帧数据源源不断地填充到该内存中去。...add除了会在WindowManagerService服务内部为指定的窗口增加一个WindowState对象之外,还会为该窗口创建一个用来接收用户输入的通道,具体可以参考Android应用程序键盘(Keyboard...前面我们已经假设了参数child所描述的SurfaceView是直接嵌入在宿主窗口的顶层视图中的,而窗口的顶层视图的父视图是使用一个ViewRoot对象来描述的,也就是说,当前正在处理的视图容器的成员变量...从前面Android应用程序窗口(Activity)的测量(Measure)、布局(Layout)和绘制(Draw)过程分析一文可以知道,窗口在绘制的过程中,每一个子视图的成员函数draw或者dispatchDraw
Android程序不像Java程序一样,随便创建一个类,写个main()方法就能运行,Android应用模型是基于组件的应用设计模式,组件的运行要有一个完整的Android工程环境,在这个环境下,Activity...它是一个抽象类,它的执行被Android系统所提供。它允许获取以应用为特征的资源和类型,是一个统领一些资源(应用程序环境变量等)的上下文。...就是说,它描述一个应用程序环境的信息(即上下文);是一个抽象类,Android提供了该抽象类的具体实现类;通过它我们可以获取应用程序的资源和类(包括应用级别操作,如启动Activity,发广播,接受Intent...上面的关系图也从另外一个侧面告诉我们Context类在整个Android系统中的地位是多么的崇高,因为很显然Activity,Service,Application都是其子类,其地位和作用不言而喻。...上图中的YES和NO我也不再做过多的解释了,这里我说一下上图中Application和Service所不推荐的两种使用情况。
您可以将虚拟对象锚定到这些可追踪的对象上,以确保在设备移动时,虚拟对象和可跟踪对象之间保持稳定的关系。...Camera android.graphics.Camera类,它提供用于捕获图像的Camera的信息。...创建 Session 和 Conig 在 Activity中的 onCreate 方法中创建 Session 和 Config是个不错的地方。...更为详细的信息请参考我的另一篇文章 为了渲染的高效,Google在Demo中大量使用了OpenGL技术。...渲染背景 // Draw background. mBackgroundRenderer.draw(frame); 通过上面的代码就可以将纹理中的内容推给 EGL,上面创建的渲染线程从 EGL 上下文中获取数据
领取专属 10元无门槛券
手把手带您无忧上云