Инициализация SurfaceView с помощью Drawable - PullRequest
5 голосов
/ 13 декабря 2010

Я хотел бы открыть 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 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.");}
}

1 Ответ

0 голосов
/ 21 марта 2011

Я сделал что-то подобное, просто назначив изображение, которое я хотел просмотреть, в XML-файле макета. Если вам все равно нужно подождать, пока ваш холст и все это будет готово, почему бы просто не использовать свойство по умолчанию? Мой начальный экран-заставка был просто видом с

android:background="@drawable/splash"

добавлено в его макет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...