hqt*_*hqt 3 android surfaceview android-layout surfaceholder
我的观点是一堆普通的小部件和一个表面视图.我不知道为什么在得到surfaceholder
SurfaceView并getSurface()
再次使用holder之后,我将始终返回null.
这是我的示例代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view);
}
@Override
public void onResume() {
super.onResume();
surface = (SurfaceView) findViewById(R.id.surfaceView);
this.holder = surface.getHolder();
if (holder.getSurface().isValid()){ // get surface again
Log.i("Notice","Surface holder is valid");
}
else
Log.i("Notice","Surface holder ISNOT valid"); //Always receive this
}
Run Code Online (Sandbox Code Playgroud)
当我看到Android文档的getSurface()
方法时.这是怎么说的:
直接访问表面对象.Surface可能并不总是可用 - 例如,在使用SurfaceView时,在将视图附加到窗口管理器并执行布局以确定Surface的尺寸和屏幕位置之前,不会创建支架的Surface.因此,您通常需要实现Callback.surfaceCreated以找出Surface何时可用.
我不太了解这一点,但我知道我错过了一些东西.请为我解释,并告诉我有关Callback.surfaceCreated
手段,以及如何实施它?
谢谢 :)
And*_*ich 11
您正在尝试使用表面尚不可用.这是正常的它是不是可在您Activity.onCreate
或Activity.onResume
因为实际上表面被放置在单独的窗口中的活动窗口的后面,有自己的生命周期方法.您需要实现SurfaceHolder.Callback来接收有关Surface
可用性的事件,并从单独的线程进行绘制.查看Android SDK示例文件夹中的LunarLander项目,它显示了如何正确使用SurfaceView.
你的回调看起来像这样:
public class MyCallback implements SurfaceHolder.Callback {
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// you need to start your drawing thread here
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// and here you need to stop it
}
}
Run Code Online (Sandbox Code Playgroud)
而且您需要将此回调设置为SurfaceHolder:
surface.getHolder().addCallback(new MyCallback());
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7468 次 |
最近记录: |