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

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

Android Studio 3.0.1
Android 8.0

 



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.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が落ちていくアニメーションです。
MainActivity.java

 
MyView.java

 
レイアウトとリソースは前と同じです。

 

サンプル動画

 

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

 

android-canvas android-canvas android-canvas canvas-image-text canvas_animation

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

誤字脱字、意味不明で分からにゃイ、
などのご意見はこちらから mailフォーム

ブックマークしておくと便利です このエントリーをはてなブックマークに追加


 


ページのトップへ戻る




シェアする

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

フォローする