android - 使用 Drawable 初始化 SurfaceView

标签 android drawable surfaceview

我想在应用程序首次启动时打开一个 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 和所有准备就绪的东西,为什么不直接使用默认属性呢?我的初始启动画面只是一个带有

的 View
android:background="@drawable/splash"

添加到其布局中。

关于android - 使用 Drawable 初始化 SurfaceView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4430865/

相关文章:

android - 由 png 和 overlay 组成的 XML drawable

android - 是否可以使用 32 位 (ARGB_8888) 表面格式的动态壁纸?

android - 多个应用程序,共享同一数据目录

android - 如何防止 ScrollView 拦截其背后 View 的点击/触摸事件?

android - 如何在android gridview中为行设置不同的列

java - 如何以编程方式向 ImageView 添加圆角边框?

android - 如何在 <gettype> ant 目标中指定 AndroidManifest.xml 文件的路径?

android - 自定义 OverlayItem 不绘制

Android:surfaceView 无法从 pause() 恢复 Activity

android - 开始视频录制时屏幕闪烁并调整大小