这几天我在研究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(); } } } } }
提前道谢!
恐怕你引用了错误的源代码。您发布的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