3
在使用SO解決我的問題一年後,我遇到了一個我找不到解決方案的問題。配置更改後忽略view.invalidate()
我正在使用多個線程來計算位圖。當計算新的位圖行時,我更新自定義視圖並調用invalidate()。但是當我旋轉手機時,位圖停止更新。在另一個屏幕旋轉後,View只更新一次,同時計算出的一部分位圖也是可見的。 onCreate方法的
部分:
view = (MyView) findViewById(R.id.view1);
if (savedInstanceState != null)
{
bitmap = savedInstanceState.getParcelable("bitmap");
view.bitmap = bitmap;
}
else
{
bitmap = Bitmap.createBitmap(400, 500, Bitmap.Config.ARGB_8888);
bitmap.eraseColor(Color.GRAY);
view.bitmap = bitmap;
}
我用handler
來更新我的觀點:
public void handleMessage(final Message msg) {
Log.i("Recieved", "redraw signal");
view.bitmap = bitmap;
view.invalidate();
}
在我看來,我使用:
Bitmap bitmap;
Rect rect;
//...constructors
@Override
protected void onSizeChanged (int w, int h, int oldw, int oldh)
{
rect = new Rect(0, 0, getWidth(), getHeight());
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
if (bitmap!=null)
{
canvas.drawBitmap(bitmap, null, rect, null);
}
Log.i("onDraw", "draw");
}
解決方案
到目前爲止,我找到了一個解決方案。如果我在onDraw
的末尾添加invalidate()
,則在屏幕方向更改後,位圖會被更新(逐行)。我不認爲這是非常「乾淨」的解決方案,所以我想了解爲什麼配置更改後忽略handler
忽略invalidate()
?
謝謝!
由於無效電話的onDraw你不應該調用內部的onDraw – Blackbelt
我同意無效,但到目前爲止,這是唯一的我有解決方案。 –