当前位置: 首页 > 知识库问答 >
问题:

View.SurfaceView,为什么它的成员mSurfaceHolder从getSurface()返回null?

陆海阳
2023-03-14

这几天我在研究Android游戏开发。我遇到一个关于SurfaceView\SurfaceHolder的问题。当我读到android SDK22中View/SurfaceView.java的源代码时,我感到很困惑。代码如下:

public class SurfaceView extends MockView {
    ...    
    public SurfaceHolder getHolder() {
        return mSurfaceHolder;
    }

    private SurfaceHolder mSurfaceHolder = new SurfaceHolder() {
        ...

        @Override
        public Surface getSurface() { return null; }
        @Override
        public Canvas lockCanvas() { return null; }
        ...

    }
}

我知道,mSurfaceHolder.getSurface()\LockCanvas非常重要,但是它返回NULL!所以,我认为这个mSurfaceHolder可能会被处理一些其他的步骤。但是我学了一个关于SurfaceView的例子,但是我没有弄清楚处理mSurfaceHolder的任何特殊步骤,这个例子的代码如下:


public class SurfaceViewTest extends Activity {

    String TAG = "SurfaceViewTest";
    FastRenderView surfaceView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_surface_view_test);
        surfaceView = new FastRenderView(this);
        setContentView(surfaceView);
    }

    @Override
    protected void onResume() {
        super.onResume();
        surfaceView.doResume();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is  
        // present.
        getMenuInflater().inflate(R.menu.menu_surface_view_test, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    /**
     * customized surfaceview class
     */
    public class FastRenderView extends SurfaceView implements Runnable {

        boolean running = false;
        SurfaceHolder holder = null;
        Thread thread = null;

        public FastRenderView(Context context) {
            super(context);
            // holder
            // getHolder() returns a SurfaceHolder implementation, it
            // isn't null, but it contains nothing.
            holder = getHolder();
            if (holder == null)
                Log.e(TAG, "failed to get valid holder");

        }

        public void doResume() {
            thread = new Thread(this);
            thread.start();
            running = true;
        }

        public Random rand = new Random();
        @Override
        public void run() {
            while (running) {
                // from android sdk 22, SurfaceView.java, we can see, this
                // holder's getSurface() returns null.
                // but why? it returns null, so here it an exception 
                // should be thrown out!
                if (!holder.getSurface().isValid()) {
                    continue;
                }

                Canvas canvas = holder.lockCanvas();
                if (canvas == null) {
                    Log.e(TAG, "get an invalid canvas to draw");
                    continue;
                }
                canvas.drawRGB(
                    rand.nextInt(255), 
                    rand.nextInt(255), 
                    rand.nextInt(255));
                holder.unlockCanvasAndPost(canvas);

                // sleep
                try {
                    Thread.sleep(1000);
                }
                catch(Exception e) {
                    e.printStackTrace();
                }
            }
            Log.i(TAG, "running ...");
        }

        public void doPause() {

            running = false;
            while (true) {
                try {
                    thread.join();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

提前道谢!

共有1个答案

楮乐邦
2023-03-14

恐怕你引用了错误的源代码。您发布的SurfaceView的代码来自layoutlib不是真正的框架源代码,SurfaceView的源代码在这里

 类似资料:
  • 初学者问题,很抱歉,如果这不是一个合适的地方,请尝试学习在中逻辑是如何工作的,我无法理解这一点 我希望它会说“是的!”如果是A、A、D或D,而是z,但出于某种原因,它会说“是的!”无论第一个符号是什么,都会断开,并且只检查第二个符号是否为z。

  • 问题内容: 令人高兴的是,Java 1.6中的javadoc 是不确定的。它是在看硬件配置还是看负载?是否足够聪明,可以避免被超线程所欺骗?它是否通过linux 命令遵守一组有限的处理器? 我可以添加自己的一个数据点:在具有12个内核和超线程的计算机上,Runtime.availableProcessors()确实返回24,这对于确定要尝试运行的线程数不是一个好数字。机器显然不是空转,因此也不能以

  • 问题内容: 这是简单的代码,我没有得到设置位图的结果,而是得到了null。谁能告诉我我在哪里犯错了? 更新 好的,所以我无法像我想的那样将文本转换为图像。这样呢 这会创建位图吗? 问题答案: 从文档中: 返回 解码的位图;如果无法解码图像,则 返回 null。 字符串“ test”中涉及的字节不是有效的位图,对吗? 如果将文本“ test”保存在名为or 等的文件中,并试图在Windows中打开它

  • 问题内容: 我已经存储了在该数据库中插入并插入记录的过程。我想获取最后插入的记录的ID。返回NULL并返回正确的ID,为什么会发生?如我所读,因此最好在表上有一些触发器的情况下使用。我可以使用吗?不论触发器如何,它是否都在表的范围内返回ID? 那么问题是什么以及使用什么呢? 已编辑 问题答案: 就像奥德(Oded)所说的那样,问题在于您在执行之前要先询问身份。 作为解决方案,最好尽可能地接近运行。

  • 我正在尝试访问项目中的文件。但是getResource方法返回null。 以及eclipse工作区中项目文件夹的外观: 为什么啊?我想访问我的资产文件夹中的文件? 编辑我创建了一个jar文件,这是jar的内容: 已解决 首先,我有很多图像文件,所以我想把它们组织在一个文件夹中。我把assets文件夹放在src目录中,最后我能够访问这些文件。

  • 我的jar中有一个图像,我正试图加载它,但是getResourceAsStream()总是返回null。 目录结构: 所容纳之物爪哇: 一般内容。爪哇: StackTrace: 我不知道为什么类加载器找不到图像。我已经在编译的jar中查看过了,文件在那里,并且在油漆中打开很好,所以文件是OK的。我已经尝试了各种ClassLoader变体,包括getSystemClassLoader(),getCl