2015年06月20日

AndroidのViewでinvalidateが反映・更新、再描画されない件

AndroidのViewでinvalidateが反映・更新、再描画されない


ペイントアプリの修正2日目。


SDKとsupportlibraryを更新したら、なぜかAndroidViewinvalidate()強制的再描画しても反映更新されなくなったので、2日ばかりはまってたのだけど、解決したので、超速攻で適当にメモ書き。


具体的には、今までは

  1. Dialogで色選択、OKボタン押下で塗りつぶし
  2. クリア選択でCanvasを白紙に戻す

を行ったら即反映されてたのだけど、Canvasを一回タップしないと、再描画反映されなくなったのです。


ThreadでRunnable内でinvalidate()やその他メソッド利用して強制的に再描画やActivity自体を更新等、色々試したけど、結局「下層のView」をいくら再描画しても、「上層のView」をinvalidate()再描画しないと下層View再描画されない仕様なのが原因だと分かりましたlol


androidのinvalidate()で再描画されない件1

こんな感じ。ペイントViewとは直接関係ない上層RelativeLayoutinvalidate()再描画する事で下層が再描画される。


androidのinvalidate()で再描画されない件2

コード上で取得したRelativeLayoutinvalidate再描画する事で下層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として利用される為)、ペイントアプリの再描画ではまった的な感じでした。


まぁこれだけのメモブログですが、同じくAndroidViewinvalidateが反映・更新、再描画されされずにはまってる方の、解決のヒントになれば幸いですw


にほんブログ村 その他日記ブログへ





posted by とまとじゅーす at 03:04| Comment(0) | TrackBack(0) | Android・Javaプログラミング
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/143343987

この記事へのトラックバック