我想在应用程序首次启动时打开一个 SurfaceView
,并在屏幕中央放置一个图标。我正在使用 SurfaceHolder.Callback
的实现来创建图标,以跟踪“Canvas”对象何时准备就绪。我的问题是有没有更好的方法?是否有更简单的方法来启动 SurfaceView
并在创建时加载一些 Drawables
而不必求助于将绘制逻辑放在回调对象中?
这是我的代码供引用。首先是绘制对象:
public class CanvasDraw{
protected final SurfaceHolder mHolder;
protected final Drawable mDrawable;
public interface DrawLogic{
void draw(Rect _surface);
}
public CanvasDraw(SurfaceView _view, Drawable _drawable){
mHolder = _view.getHolder();
mDrawable = _drawable;
}
public void draw(DrawLogic _logic){
Canvas canvas = null;
try{
canvas = mHolder.lockCanvas();
if( canvas != null ){
Log.i("DRAWABLE", "Drawing " + mDrawable.toString());
_logic.draw( mHolder.getSurfaceFrame() );
mDrawable.draw(canvas);
}
else{
Log.i("DRAWABLE", "Canvas null valued");
}
}
finally{
if( canvas != null ){
mHolder.unlockCanvasAndPost(canvas);
}
}
}
}
然后是我的私有(private)回调对象:
private class DrawOnceCallback implements SurfaceHolder.Callback {
private final SurfaceHolder mHolder;
public DrawOnceCallback(SurfaceHolder _holder ){
mHolder = _holder;
mHolder.addCallback(this);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.i("SURFACEHOLDER","Surface created. Canvas available.");
mDrawTiles.draw( new CanvasDraw.DrawLogic(){
@Override
public void draw(Rect _surface) {
mTiles.setBounds(
_surface.centerX() - mDrawWidth/2,
_surface.centerY() - mDrawHeight/2,
_surface.centerX() + mDrawHeight/2,
_surface.centerY() + mDrawHeight/2);
}
});
mHolder.removeCallback(this);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {Log.i("SURFACEHOLDER","Surface destroyed.");}
}
最佳答案
我只是通过将我想要的图像分配给布局 XML 文件中的 View 来完成类似的操作。如果你必须等到你的 Canvas 和所有准备就绪的东西,为什么不直接使用默认属性呢?我的初始启动画面只是一个带有
的 Viewandroid:background="@drawable/splash"
添加到其布局中。
关于android - 使用 Drawable 初始化 SurfaceView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4430865/