什么时候是必要的,或者更好地使用SurfaceView而不是View?
当前回答
以下是我注意到的几点:
SurfaceViews包含一个很好的渲染机制,它允许线程在不使用处理程序的情况下更新表面的内容(对动画很好)。 Surfaceviews不能是透明的,它们只能出现在视图层次结构中的其他元素后面。 我发现它们比渲染到视图上的动画要快得多。
有关更多信息(以及一个很好的使用示例),请参阅SDK中的LunarLander项目 的例子部分。
其他回答
以下是我注意到的几点:
SurfaceViews包含一个很好的渲染机制,它允许线程在不使用处理程序的情况下更新表面的内容(对动画很好)。 Surfaceviews不能是透明的,它们只能出现在视图层次结构中的其他元素后面。 我发现它们比渲染到视图上的动画要快得多。
有关更多信息(以及一个很好的使用示例),请参阅SDK中的LunarLander项目 的例子部分。
为什么使用SurfaceView而不是经典的View类…
一个主要原因是SurfaceView可以快速渲染屏幕。
简单地说,SV更有能力管理时间和渲染动画。
为了更好地理解什么是SurfaceView,我们必须将它与View类进行比较。
有什么不同……请看视频中的简单解释
https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30
对于视图,我们有一个主要问题....渲染动画的时间。
通常从Android运行时系统调用onDraw()。
因此,当Android运行时系统调用onDraw()时,应用程序无法控制
显示的时间,这对动画很重要。我们在时间上有差距
应用(游戏邦注:即我们的游戏)和Android运行时系统之间的关系。
SV可以通过专用线程调用onDraw()。
因此:应用程序控制时间。所以我们可以显示动画的下一个位图图像。
视图都绘制在相同的GUI线程上,该线程也用于所有用户交互。
所以,如果你需要快速更新GUI,或者渲染花费太多时间,影响用户体验,那么就使用SurfaceView。
One of the main differences between surfaceview and view is that to refresh the screen for a normal view we have to call invalidate method from the same thread where the view is defined. But even if we call invalidate, the refreshing does not happen immediately. It occurs only after the next arrival of the VSYNC signal. VSYNC signal is a kernel generated signal which happens every 16.6 ms or this is also known as 60 frame per second. So if we want more control over the refreshing of the screen (for example for very fast moving animation), we should not use normal view class.
另一方面,在surfaceview的情况下,我们可以尽可能快地刷新屏幕,我们可以从后台线程完成。surfaceview的刷新真的不依赖于VSYNC,如果我们想做高速动画,这是非常有用的。我有一些培训视频和示例应用程序,可以很好地解释所有这些事情。请看下面的培训视频。
https://youtu.be/kRqsoApOr9U
https://youtu.be/Ji84HJ85FIQ
https://youtu.be/U8igPoyrUf8
主要的区别是SurfaceView可以被背景头绘制,但Views不能。 SurfaceViews使用更多的资源,所以你不想使用它们,除非你必须。
推荐文章
- 警告:API ' variable . getjavacompile()'已过时,已被' variable . getjavacompileprovider()'取代
- 安装APK时出现错误
- 碎片中的onCreateOptionsMenu
- TextView粗体通过XML文件?
- 如何使线性布局的孩子之间的空间?
- DSL元素android.dataBinding。enabled'已过时,已被'android.buildFeatures.dataBinding'取代
- ConstraintLayout:以编程方式更改约束
- PANIC: AVD系统路径损坏。检查ANDROID_SDK_ROOT值
- 如何生成字符串类型的buildConfigField
- Recyclerview不调用onCreateViewHolder
- Android API 21工具栏填充
- Android L中不支持操作栏导航模式
- 如何在TextView中添加一个子弹符号?
- PreferenceManager getDefaultSharedPreferences在Android Q中已弃用
- 在Android Studio中创建aar文件