SurfaceViewは入力を拾う方法がいろいろあります。
表2 SurfaceViewの入力イベント | ||||||||||
|
ここでは、キーイベント、タッチイベント、トラックボールイベントについて見てみます。難しいことは何もなく、SurfaceViewを継承したクラスで、メソッドをオーバーライドするだけです。
タッチイベント/トラックボールイベントは、直前の状態に上書きしているので、残像のように表示されます。
どちらもSurfaceViewに用意されているコールバックメソッドをオーバーライドするだけですが、気を付けなければならないのは、SurfaceViewがフォーカスを受け取れるようにsetFocusable(true)を呼び出すこと、さらにキーイベントの場合は、requestFocus()などでフォーカスを与えてやることです。
最後に、透明なSurfaceViewの作り方を説明します。サンプルに「Transparent」というActivityがあります。これを起動すると、以下のような画面になります。
すでに今回のサンプルアプリ(SurfaceView Example.zip)をダウンロードして動作させていた読者にとってはいまさらなのですが、今回のActivityの1つはAndroidのテーマを適用しています。
<activity android:name=".Main" android:theme="@android:style/Theme.Wallpaper" android:label="SurfaceView Example">
AndroidManifest.xmlは上記のように「android:theme」という属性を設定してあります。壁紙のテーマですね。
さて、SurfaceViewを透明にする方法ですが、ポイントは2つあります。
1つはAndroidManifest.xmlのActivityの定義です。
<activity android:name=".Transparent" android:label="Transparent SurfaceView" android:theme="@android:style/Theme.Translucent" />
透明にしたいActivityのandroid:theme属性に「@android:style/Theme.Translucent」、またはその派生値を設定します。
ソースコード上では、SurfaceHolderのsetFormat(int)にPixelFormat.TRANSPARENTまたはPixelFormat.TRANSLUCENTを指定します。
public MySurfaceView(Context context) { super(context); getHolder().setFormat(PixelFormat.TRANSPARENT); getHolder().addCallback(this); setFocusable(true); }
今回のデモアプリには、Viewの透明化を行うサンプルも、おまけで入れておきました。
完全透明だけではなく、半透明もサポートしています。方法を簡単に説明します。以下のようなXMLを「values」フォルダに定義します。ファイル名は任意でよいです。
<?xml version="1.0" encoding="utf-8"?> <resources> <drawable name="translucent_background">#77ffffff</drawable> <style name="Theme.Translucent" parent="android:style/Theme.Translucent"> <item name="android:windowBackground">@drawable/translucent_background</item> </style> </resources>
ここで定義している<drawable>要素が、透明度を含む背景色です。先頭の77の部分がアルファ値で、ffなら不透明、00なら透明です。その後ろは、RRGGBBで色を指定します。そして、この<drawable>要素を独自で定義した<style>要素のandroid:windowBackgroundに指定しています。
次に、AndroidManifest.xmlの該当のActivityに、先ほど定義した<style>要素をandroid:themに指定します。
<activity android:name=".TranslucentView" android:label="Translucent View" android:theme="@style/Theme.Translucent" />
このようにすれば、GUIフレームワークが自動で指定した色と透明度で背景を塗りつぶしてくれます。SurfaceViewはGUIフレームワークから独立しているので、この仕組みが使用できないのです。
これで背景が透明なActivityとSurfaceViewの完成です。ただ残念なことに、透明のSurfaceViewは一度何かを書いてしまうと、後から透明色で塗りつぶせないため、使い勝手がいまひとつです。
背景を透明にしたまま、かつViewの内容を更新したい場合、Viewを使うか、SurfaceViewのサブクラスであるGLSurfaceView(OpenGL ES)を使うか、のどちらかになってしまいます。
OpenGL ESについては、今後取り上げたいテーマなので、そのときに詳しく説明しようと思います。OpenGL ESとAndroidについては、下記記事もご参照ください。
Copyright © ITmedia, Inc. All Rights Reserved.