5
SurfaceView
は、アプリケーションが最初に起動されたときにアイコンが画面の中央に配置されるようにしたいと考えています。私はSurfaceHolder.Callback
の実装を使用してアイコン作成を呼び起こして、 'キャンバス'オブジェクトの準備が整ったことを追跡します。私の質問は、より良い方法があるということですか? SurfaceView
を起動して、コールバックオブジェクト内に描画ロジックを配置する必要がなく、作成時にDrawables
がロードされる厄介な方法はありませんか?DrawableでSurfaceViewを初期化する
ここに参考のためのコードがあります。まず、描画ん対象:
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.");}
}
私はSurfaceViewを使用して多くの問題を抱えています。私はSurfaceViewのようなアクティビティをfinish()mehtodで終了できません。私がOutOfMemoryExceptionを出すのは、私が13 SufraceView ...と言うときに出てきます。私は困っています。あなたはそれらを仕上げる方法を知っていますか?私はSurfaceViewでクラスを拡張しています。 –