什么时候是必要的,或者更好地使用SurfaceView而不是View?
当前回答
视图都绘制在相同的GUI线程上,该线程也用于所有用户交互。
所以,如果你需要快速更新GUI,或者渲染花费太多时间,影响用户体验,那么就使用SurfaceView。
其他回答
以下是我注意到的几点:
SurfaceViews包含一个很好的渲染机制,它允许线程在不使用处理程序的情况下更新表面的内容(对动画很好)。 Surfaceviews不能是透明的,它们只能出现在视图层次结构中的其他元素后面。 我发现它们比渲染到视图上的动画要快得多。
有关更多信息(以及一个很好的使用示例),请参阅SDK中的LunarLander项目 的例子部分。
视图都绘制在相同的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是Android中的自定义视图,可用于在其中绘制。 视图和SurfaceView之间的主要区别是视图是在 UI线程,用于所有用户交互。 如果你想要快速更新UI并呈现大量的信息 那么,SurfaceView是一个更好的选择。
但是SurfaceView有一些内部技术:
1. 它们不是硬件加速的。 2. 当您调用invalidate或postInvalidate()方法时,正常视图将被呈现,但这并不意味着视图将被呈现 立即更新(将发送一个垂直同步,由操作系统决定何时 它得到更新。SurfaceView可以立即更新。 3.SurfaceView有一个已分配的表面缓冲区,因此它的开销更大
为什么使用SurfaceView而不是经典的View类…
一个主要原因是SurfaceView可以快速渲染屏幕。
简单地说,SV更有能力管理时间和渲染动画。
为了更好地理解什么是SurfaceView,我们必须将它与View类进行比较。
有什么不同……请看视频中的简单解释
https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30
对于视图,我们有一个主要问题....渲染动画的时间。
通常从Android运行时系统调用onDraw()。
因此,当Android运行时系统调用onDraw()时,应用程序无法控制
显示的时间,这对动画很重要。我们在时间上有差距
应用(游戏邦注:即我们的游戏)和Android运行时系统之间的关系。
SV可以通过专用线程调用onDraw()。
因此:应用程序控制时间。所以我们可以显示动画的下一个位图图像。
推荐文章
- 警告: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文件