View.SurfaceView,为啥它的成员mSurfaceHolder从getSurface()返回null?
Posted
技术标签:
【中文标题】View.SurfaceView,为啥它的成员mSurfaceHolder从getSurface()返回null?【英文标题】:View.SurfaceView, why its member, mSurfaceHolder, returns null from getSurface()?View.SurfaceView,为什么它的成员mSurfaceHolder从getSurface()返回null? 【发布时间】:2015-09-12 02:08:53 【问题描述】:这些天我正在学习 android 游戏开发。我遇到一个关于 SurfaceView\SurfaceHolder 的问题。当我在android sdk 22 中阅读View/SurfaceView.java 的源代码时,我很困惑。以下是代码:
公共类 SurfaceView 扩展 MockView ... 公共 SurfaceHolder getHolder() 返回 mSurfaceHolder; 私有 SurfaceHolder mSurfaceHolder = 新 SurfaceHolder() ... @覆盖 public Surface getSurface() return null; @覆盖 public Canvas lockCanvas() return null; ...我知道,mSurfaceHolder.getSurface()\lockCanvas 很重要,但是它返回null!所以,我认为这个 mSurfaceHolder 可能会处理一些其他步骤。但是我学了一个SurfaceView的例子,但是我没有想出处理mSurfaceHolder的特殊步骤,例子代码如下:
公共类 SurfaceViewTest 扩展 Activity 字符串标签 = "SurfaceViewTest"; FastRenderView 表面视图 = null; @覆盖 protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); //setContentView(R.layout.activity_surface_view_test); surfaceView = new FastRenderView(this); 设置内容视图(表面视图); @覆盖 受保护的无效 onResume() 超级.onResume(); surfaceView.doResume(); @覆盖 公共布尔 onCreateOptionsMenu(菜单菜单) // 膨胀菜单;如果是,这会将项目添加到操作栏 // 展示。 getMenuInflater().inflate(R.menu.menu_surface_view_test, menu); 返回真; @覆盖 public boolean onOptionsItemSelected(MenuItem item) // 处理操作栏项目点击这里。操作栏将 // 自动处理对 Home/Up 按钮的点击,这么久 // 当您在 AndroidManifest.xml 中指定父活动时。 int id = item.getItemId(); //无检查 SimplifiableIfStatement 如果(id == R.id.action_settings) 返回真; 返回 super.onOptionsItemSelected(item); /** * 自定义的surfaceview类 */ 公共类 FastRenderView 扩展 SurfaceView 实现 Runnable 布尔运行 = 假; SurfaceHolder 支架 = null; 线程线程=空; 公共 FastRenderView(上下文上下文) 超级(上下文); // 持有者 // getHolder() 返回一个 SurfaceHolder 实现,它 // 不为空,但它不包含任何内容。 持有人 = getHolder(); 如果(持有人==空) Log.e(TAG, "获取有效持有人失败"); 公共无效doResume() 线程 = 新线程(这个); 线程.start(); 运行=真; 公共随机 rand = new Random(); @覆盖 公共无效运行() 在跑步的时候) // 从android sdk 22,SurfaceView.java,我们可以看到,这个 // 持有者的 getSurface() 返回 null。 // 但为什么?它返回null,所以这里是一个异常 // 应该被扔掉! if (!holder.getSurface().isValid()) 继续; 画布画布 = holder.lockCanvas(); 如果(画布==空) Log.e(TAG, "获取无效的画布进行绘制"); 继续; 画布.drawRGB( rand.nextInt(255), rand.nextInt(255), rand.nextInt(255)); holder.unlockCanvasAndPost(canvas); // 睡觉 尝试 线程.sleep(1000); 捕获(异常 e) e.printStackTrace(); Log.i(TAG, "正在运行..."); 公共无效doPause() 运行=假; 而(真) 尝试 线程.join(); 捕捉(异常 e) e.printStackTrace();提前致谢!
【问题讨论】:
【参考方案1】:恐怕你引用了错误的源代码。你发的SurfaceView的代码来自layoutlib不是真正的框架源码,SurfaceView的源码是here
【讨论】:
谢谢,你是对的,你能解释一下它们之间的区别吗?我从 Android SDK Manager 下载了源代码。 我看到了来自:androidxref.com/5.1.0_r1/xref/frameworks/base/tools/layoutlib 的说明,上面写着“Layoutlib 是 android View 框架的自定义版本,旨在在 Eclipse 中运行。该库的目标是在 Eclipse 中提供布局渲染,非常接近它们在设备上的渲染效果。”那么,我从 SDK 管理器下载的源代码只是“Android SDK 的源代码”而不是 Android 框架源代码?我对吗?谢谢。 是的,但只有少数不同。以上是关于View.SurfaceView,为啥它的成员mSurfaceHolder从getSurface()返回null?的主要内容,如果未能解决你的问题,请参考以下文章
请教view,SurfaceView,GLSurfaceView的关系和区别
android: View, SurfaceView, GLSurfaceView, TextureView 区别与联系
尝试在空对象引用上调用虚拟方法 'android.view.SurfaceHolder android.view.SurfaceView.getHolder()'
java.lang.NoSuchMethodError: 没有直接方法 <init>(Landroid/view/SurfaceView;II)V