界面刷新你不知道的东西

程序员小迷 2024-07-13 11:33:38

一、概述。

View、SurfaceView、GLSurfaceView、TextureView都可用于显示视频、动画、游戏或其他图形内容。

二、被动更新画面。

以游戏举例,比如棋类,这种用View就好了。因为画面的更新是依赖于 onTouch 触摸事件来更新,在UI线程中可以使用 invalidate(),在非UI线程中可以使用postInvalidate()来触发。 在这种情况下,这一次Touch和上一次Touch间隔的时间比较长,不会产生影响。

三、主动更新画面。

以一个人在一直跑动为例。这就需要一个单独的Thread不停的重绘人的状态,避免阻塞main UI 线程。所以显然View不合适,而应该需要用SurfaceView来控制。因为SurfaceView可以在非UI线程中进行界面刷新,绘图操作在独立的线程中完成,特别适合于那些需要频繁更新界面的应用,如视频播放、游戏等。

四、3D游戏、3D设计、3D展示界面、3D地图。

为了追求极致的性能和帧率,可以使用GLSurfaceView(继承自SurfaceView)。其本身就封装了一些OpenGL ES的API(上下文管理、渲染循环等复杂操作),配合各个平台实现的EGL, 通过着色器(OpenGL/OpenGLES(OpenGL for Embedded Systems) Shader Language中的顶点着色器、片元着色器)可以达到很多View难以达到的效果。适合需要复杂3D图形渲染的应用。

五、SurfaceView与TextureView。

1.SurfaceView和TextureView都继承自View。

2.SurfaceView在API 1及以上版本可用,TextureView在API 14及以上版本可用。

3.TextureView只能使用在硬件加速窗口中。在用软件渲染时,TextureView不会绘制任何东西。

4.SurfaceView可在独立的线程中进行绘制,而TextureView在主线程中进行绘制。

5.SurfaceView窗口刷新的时候不需要重绘应用程序的窗口(Android普通窗口的View绘制机制是一层一层的,任何一个子元素刷新或局部的刷新都会导致整个视图结构全部重绘一次,因此效率非常低下,不过满足普通应用界面的需求还是绰绰有余),但是SurfaceView也有一些非常不便的限制。因为SurfaceView的内容不在应用窗口上,是在应用窗口之外的一个独立的绘图表面Surface(显示在应用程序窗口之上)上进行绘制,所以不能使用变换(平移(Translate)、缩放(Scale)、旋转(Rotate)、倾斜(Skew)等)。所以如果是对于视频播放器、OpenGL场景或者相机应用的开发,TextureView更加适合。

6.SurfaceView绘制在独立的层上,不支持透明度、动画效果和变换。

TextureView支持透明度、动画效果和变换。

7.TextureView的性能低于SurfaceView,,因为它涉及额外的缓冲区和可能的同步开销。

8.SurfaceView使用双缓冲机制,在一个独立的窗口进行绘制,所以在某些设备上,SurfaceView的内容可能在窗口切换时丢失。而TextureView将内容绘制在一个普通的View上,不需要独立的窗口,因此不会出现内容丢失的问题。

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

0 阅读:7

程序员小迷

简介:致力于Android、iOS、C、Java等编程技术的技巧经验分享