連載
» 2009年12月08日 00時00分 公開

Androidで動く携帯Javaアプリ作成入門(12):SurfaceViewならAndroidで高速描画ゲームが作れる (3/3)

[緒方聡,株式会社イーフロー]
前のページへ 1|2|3       

キー/タッチ/トラックボールのイベントをトリガーに描画

 SurfaceViewは入力を拾う方法がいろいろあります。

表2 SurfaceViewの入力イベント
イベント メソッド
キーイベント onKeyDown、onKeyUpなど
タッチイベント onTouchEvent
トラックボールイベント onTrackballEvent
フォーカスイベント onFocusChanged

 ここでは、キーイベント、タッチイベント、トラックボールイベントについて見てみます。難しいことは何もなく、SurfaceViewを継承したクラスで、メソッドをオーバーライドするだけです。

図5 キーイベント(左)とタッチイベント/トラックボールイベント(右) 図5 キーイベント(左)とタッチイベント/トラックボールイベント(右)

 タッチイベント/トラックボールイベントは、直前の状態に上書きしているので、残像のように表示されます。

 どちらもSurfaceViewに用意されているコールバックメソッドをオーバーライドするだけですが、気を付けなければならないのは、SurfaceViewがフォーカスを受け取れるようにsetFocusable(true)を呼び出すこと、さらにキーイベントの場合は、requestFocus()などでフォーカスを与えてやることです。

透明な背景のSurfaceViewを作るには

 最後に、透明なSurfaceViewの作り方を説明します。サンプルに「Transparent」というActivityがあります。これを起動すると、以下のような画面になります。

図6 図4・5のジェスチャーの比較 図6 透明なSurfaceView

 すでに今回のサンプルアプリ(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の定義

 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」、またはその派生値を設定します。

【2】ソースコードで行うこと

 ソースコード上では、SurfaceHolderのsetFormat(int)にPixelFormat.TRANSPARENTまたはPixelFormat.TRANSLUCENTを指定します。

public MySurfaceView(Context context) {
    super(context);
    getHolder().setFormat(PixelFormat.TRANSPARENT);
    getHolder().addCallback(this);
    setFocusable(true);
}

おまけ 「Viewの透明化をするには」

今回のデモアプリには、Viewの透明化を行うサンプルも、おまけで入れておきました。

図7 「9」というジェスチャー 図7 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フレームワークから独立しているので、この仕組みが使用できないのです。


OpenGL ESを使うと、もっとイロイロできる

 これで背景が透明なActivityとSurfaceViewの完成です。ただ残念なことに、透明のSurfaceViewは一度何かを書いてしまうと、後から透明色で塗りつぶせないため、使い勝手がいまひとつです。

 背景を透明にしたまま、かつViewの内容を更新したい場合、Viewを使うか、SurfaceViewのサブクラスであるGLSurfaceView(OpenGL ES)を使うか、のどちらかになってしまいます。

 OpenGL ESについては、今後取り上げたいテーマなので、そのときに詳しく説明しようと思います。OpenGL ESとAndroidについては、下記記事もご参照ください。


「Androidで動く携帯Javaアプリ作成入門」バックナンバー
前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。