У меня есть класс, который расширяет представление. Этот класс имеет переменную-член mCanvasпеременная члена null после возврата функции?
private Canvas mCanvas;
Эта переменная создается, когда представление изменяет размер, поэтому соответствующие размеры для холста установлены:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
int curW = mBitmap != null ? mBitmap.getWidth() : 0;
int curH = mBitmap != null ? mBitmap.getHeight() : 0;
if (curW >= w && curH >= h) {
return;
}
if (curW < w) curW = w;
if (curH < h) curH = h;
Bitmap canvasBitmap = Bitmap.createBitmap(curW, curH, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(canvasBitmap);
if (mBitmap != null) {
mCanvas.drawBitmap(mBitmap, 0, 0, null);
}
mBitmap = canvasBitmap;
}
Но в моей OnDraw функции я получаю исключение нулевого указателя, когда я пытаюсь получить ширину/высоту моего холста. Я был не уверен, когда onSizeChanged на самом деле вызван, я предполагал, что он всегда будет вызван, когда будет создан вид, и поэтому перед onDraw.
Но если мой OnDraw начинается с этого:
@Override
protected void onDraw(Canvas canvas) {
if (mBitmap != null) {
if(mCanvas == null)
{
Log.d("testing","mCanvas is null"
}
LogCat всегда показывает сообщение "mCanvas является нулевой", когда я достичь OnDraw.
Так я изменил код так, что если mCanvas равно нулю, когда я прочитал OnDraw я просто создать его снова:
private void resizeCanvas()
{
int curW = mBitmap != null ? mBitmap.getWidth() : 0;
int curH = mBitmap != null ? mBitmap.getHeight() : 0;
if (curW >= this.getWidth() && curH >= this.getHeight()) {
return;
}
if (curW < this.getWidth()) curW = this.getWidth();
if (curH < this.getHeight()) curH = this.getHeight();
Bitmap canvasBitmap = Bitmap.createBitmap(curW, curH, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(canvasBitmap);
if (mBitmap != null) {
mCanvas.drawBitmap(mBitmap, 0, 0, null);
}
mBitmap = canvasBitmap;
}
@Override
protected void onDraw(Canvas canvas) {
if (mBitmap != null) {
if(mCanvas == null)
{
resizeCanvas();
if(mCanvas == null)
{
Log.d("test","canvas is still null");
}
LogCat еще печатает «холст еще пустой»
Может кто-то объяснить, что здесь происходит? Я очень новичок в андроиде, и большая часть этого кода взята из примера touchpaint, с которым я играл.
Если я проверяю внутри resizeCanvas, если mCanvas имеет значение null, он всегда говорит, что он не является нулевым. Но если я проверю сразу после вызова этой функции, она всегда равна нулю.