[Android] Canvas クリアーして再描画

Canvas で描画した領域を動的に非表示にしたり表示したりする場合には、canvas.drawColor(0, PorterDuff.Mode.CLEAR) を使います。また同時に、クリアした後で再描画しないと非表示になりません。
 
下はボタンを押すとCanvasで描画しているエリアをクリアして、レイアウトで表示している文字列のみにする例です

cnvas3_1
ボタンをタップ
cnvas3_2
CanvasをClear

Android Studio 2.1.1
Android 6.0

 

sponsored link

PorterDuff.Mode.CLEAR

 
再描画のためにはinvalidate()を使います。Canvasをクリアしてから描画です。
ただし、invalidate()は再描画させるためにonDraw()を呼び出しますが、即呼びだしはせずに都合がつくまで待たされるようです。ですから、即非表示を想定する場合はこのままでは使えませんので注意。
 

Canvas の作成

 
以前の方法 と同じに作っていきます
 
例として package は 「package com.example.testlayoutcanvas2」 で設定しました
button によりフラグを切り替え
canvas.drawColor(0, PorterDuff.Mode.CLEAR);
を実行して
invalidate();
で再描画します
 
TestView.java

 
MainActivity.java

 
activity_main.java

 
マニュアルで表示・非表示ができました

invalidate()ですが、ちゃんと使うにはHandler等を利用するようです
Event Handling and Threading

Note: The entire view tree is single threaded. You must always be on the UI thread when calling any method on any view. If you are doing work on other threads and want to update the state of a view from that thread, you should use a Handler 

 
 

cnvas1_1 cnvas2_1b cnvas3_1 canvasImage01 circle_animation02