AndroidのViewでinvalidateが反映・更新、再描画されない
ペイントアプリの修正2日目。
SDKとsupportlibraryを更新したら、なぜかAndroidのViewでinvalidate()、強制的に再描画しても反映・更新されなくなったので、2日ばかりはまってたのだけど、解決したので、超速攻で適当にメモ書き。
具体的には、今までは
- Dialogで色選択、OKボタン押下で塗りつぶし
- クリア選択でCanvasを白紙に戻す
を行ったら即反映されてたのだけど、Canvasを一回タップしないと、再描画、反映されなくなったのです。
ThreadでRunnable内でinvalidate()やその他メソッド利用して強制的に再描画やActivity自体を更新等、色々試したけど、結局「下層のView」をいくら再描画しても、「上層のView」をinvalidate()、再描画しないと下層Viewが再描画されない仕様なのが原因だと分かりましたlol
こんな感じ。ペイントViewとは直接関係ない上層のRelativeLayoutをinvalidate()、再描画する事で下層が再描画される。
コード上で取得したRelativeLayoutをinvalidate、再描画する事で下層Viewも再描画された。
~ 省略 ~
public static RelativeLayout relativeRayout;
relativeRayout = (RelativeLayout)findViewById(R.id.relativeLayout);
~ 省略 ~
case R.id.item7:
if(MyView.undo==1){ // 1の時は一回しか書いてないので、白紙に戻す
clearAll();
}
else{
saveLoad.loadFromTemps();
myView.mCanvas = new Canvas(MyView.getmBitmap());
myView.mBitmapPaint.reset();
MyView.undo++;
relativeRayout.invalidate(); // 上層のViewを再描画
~ 省略 ~
つまりこのアプリの場合、ToolBarが上層に来てるので、最下層のペイントViewをいくら再描画、更新しても、それ以上上層のViewをinvalidate、再描画しない限り、反映されなかったというおちでした。
また、invalidate()メソッドは呼び出せば即反映されるという訳ではないという事も分かった。
あるタイミングでonDraw()を呼び出すので、そのタイミングが来るまで再描画は保留されてるという事です。
つまり僕の場合、ActionBarからToolbarへ変更する事により、ペイントViewの上層にToolbarが来る仕様になったので(Toolbar自体がViewとして利用される為)、ペイントアプリの再描画ではまった的な感じでした。
まぁこれだけのメモブログですが、同じくAndroidのViewでinvalidateが反映・更新、再描画されされずにはまってる方の、解決のヒントになれば幸いですw