I am studying Android Game Development these days. I come
across a problem about SurfaceView\SurfaceHolder. When I read the source code of
View/SurfaceView.java in android sdk 22, I am confused. following is the
code:
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;
}
...
}
}
I know,
mSurfaceHolder.getSurface()\lockCanvas are very important, but it returns null! So, I
think this mSurfaceHolder may be dealt with some other steps. But I have learned an
example about SurfaceView, but I didn't figout out any special steps to deal with
mSurfaceHolder, the example's code is as
following:
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();
}
}
}
}
}
Thanks
in advance!
No comments:
Post a Comment