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

Canvas で描画した領域を動的に非表示にしたり表示したりする場合には、canvas.drawColor(0, PorterDuff.Mode.CLEAR) を使います。また同時に、クリアした後で再描画しますがそれには invalidate() を使います。
 
1x1.trans - [Android] Canvas クリアーして再描画


Android Studio
2021.2.1

 




Canvasの再描画

 
先の例でCanvasのViewをRelativeLayoutの中で使うことをやってみました。TextViewなどは表示、非表示ができますがCanvasの場合はどうでしょう。
Cavasの場合は一旦クリアーして、その後再描画が必要です。次に表示させる時にもまた再描画が必要です。

最初に簡単のためボタンで表示・非表示を実装してみたいと思います。その後でHandlerを使ってCanvasのViewをアニメーションさせてみます。
 

 

invalidate()

 
描画をクリアーするには、

canvas.drawColor(0, PorterDuff.Mode.CLEAR)

を使います。

また再描画のためにはinvalidate()を使います。Canvasをクリアしてから描画です。
ただし、invalidate()は再描画させるためにonDraw()を呼び出しますが、即呼び出されるわけではなく、都合がつくまで待たされるようです。ですから、即非表示を想定する場合はHandlerを使う方法が必要になります。

以前にCanvasを作成した方法 と同様に作成します。
例として package は 「package com.example.testcanvasclear」 で設定しました。
button によりフラグを切り替え
canvas.drawColor(0, PorterDuff.Mode.CLEAR);
を実行して
invalidate();
で再描画します

 

サンプルコード

 
新しくMyViewクラスを作成

MyView.java


 
MainActivity.java


 
activity_main.xml


 
Stringのリソース
strings.xml


 

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

 

Handlerを使う

 
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 

 

Handlerを使ってアニメーションの作成

 
試しにHandlerとinvalidate()を使ってアニメーションを作ってみます。
Handlerで50msec毎にCanvas上のCircleのY軸座標を増加させて、Circleが落ちていくアニメーションです。

packageは com.example.testcanvasclearhandler
に変更しました。

また、Handler()はAPI30から非推奨になりnullにならないようにする手当が必要です。
Handler(Looper.getMainLooper())

MainActivity.java


 
MyView.java


 
レイアウトとリソース
activity_main.xml


strings.xml

 

サンプル動画

 

 
Handlerを使わないでAnimationを使ったやり方がこちらにあります。
 

 

1x1.trans - [Android] Canvas クリアーして再描画 1x1.trans - [Android] Canvas クリアーして再描画 1x1.trans - [Android] Canvas クリアーして再描画 1x1.trans - [Android] Canvas クリアーして再描画 1x1.trans - [Android] Canvas クリアーして再描画

 
References:
Canvas | Android Developers
Canvas and Drawables | Android Developers

シェアする

  • このエントリーをはてなブックマークに追加

フォローする