ошибка блокировки холста и холст нулевой при использовании SurfaceView - PullRequest
2 голосов
/ 01 марта 2012

Вопрос об Android SurfaceView.Я хочу нарисовать круг в SurfaceView, но холст нулевой в методе SimpleDraw. Почему?№ 1, холст нулевой.№ 2, метод SimpleDraw запускается в ClickListener, верно, холст не нулевой, почему?

1.public class SurfaceTestActivity extends Activity {
SurfaceView sfv;
SurfaceHolder sfh;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    sfv=(SurfaceView)findViewById(R.id.surface);
    sfh=sfv.getHolder();
    SimpleDraw();

}

void SimpleDraw(){
    Canvas canvas = sfh.lockCanvas(new Rect(0, 0, 300,
            getWindowManager().getDefaultDisplay().getHeight()));
    Paint mPaint = new Paint();
    mPaint.setColor(Color.GREEN);
    mPaint.setStrokeWidth(2);
    canvas.drawCircle(150, 150, 80, mPaint);
    sfh.unlockCanvasAndPost(canvas);
    }

}

2.public class SurfaceTestActivity extends Activity {
Button simpleButton;
SurfaceView sfv;
SurfaceHolder sfh;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    simpleButton=(Button)findViewById(R.id.simple);
    sfv=(SurfaceView)findViewById(R.id.surface);
    sfh=sfv.getHolder();
    simpleButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            //SimpleDraw();
        }
    });
}

void SimpleDraw(){
    Canvas canvas = sfh.lockCanvas(new Rect(0, 0, 300,
            getWindowManager().getDefaultDisplay().getHeight()));
    Paint mPaint = new Paint();
    mPaint.setColor(Color.GREEN);
    mPaint.setStrokeWidth(2);
    canvas.drawCircle(150, 150, 80, mPaint);
    sfh.unlockCanvasAndPost(canvas);
    }

}

1 Ответ

2 голосов
/ 01 марта 2012

Разница во времени.

Нет. 1 Пытается нарисовать на холсте до того, как он будет создан и потерпит неудачу. Вызов sfh.lockCanvas(...) завершается неудачно и возвращает null, а не Canvas.

Нет. 2 Пытается нарисовать после того, как холст был создан, поэтому он работает.

Сделайте это:

public class SurfaceTestActivity extends Activity implements SurfaceHolder.Callback {
SurfaceView sfv;
SurfaceHolder sfh;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    sfv=(SurfaceView)findViewById(R.id.surface);
    sfh=sfv.getHolder();
    sfh.addCallback(this);

}

void SimpleDraw(){
    Canvas canvas = sfh.lockCanvas(new Rect(0, 0, 300,
            getWindowManager().getDefaultDisplay().getHeight()));
    Paint mPaint = new Paint();
    mPaint.setColor(Color.GREEN);
    mPaint.setStrokeWidth(2);
    canvas.drawCircle(150, 150, 80, mPaint);
    sfh.unlockCanvasAndPost(canvas);
}



@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    // draw AFTER surface created!
    simpleDraw();

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

ИЗМЕНЕНИЙ:

добавление SurfaceHolder.Callback

добавление sfh.addCallback(this);

добавление 3 @Override методов с новым SimpleDraw - после создания холста.

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