SurfaceViewでスプライト(背景透過)

7,010 views
Skip to first unread message

KiyoKiyo

unread,
Mar 3, 2012, 9:24:05 PM3/3/12
to 日本Androidの会
kiyokiyoと申します。

Androidでスプライトを実現したいと思っています。

まずはViewによる実現。
ベースとなるFrameLayoutに対してViewを複数重ねるように配置して
それぞれのViewに描画することで実現します。
Viewは元々背景が透明なので、特に何も気にしなくても
Framelayoutに描画された背景の上にViewの描画を重ねることができました。
また一度描画したものを消す場合もPaintの設定を下記にすることで透明色で上書きすることで実現できました。
bg_paint.setXfermode(new PorterDuffXfermode(Mode.SRC));
bg_paint.setColor(0);

しかしViewでは描画速度が満足いくものが得られなかったため
SurfaceViewで同じことをやりました。

Viewの場合と同様にFrameLayoutに対して複数のSurfaceViewを重ねて配置、
背景を透明にするために下記設定を行いました。
holder = getHolder();
holder.setFormat(PixelFormat.TRANSPARENT);

しかしこの場合、背景が真っ黒に塗りつぶされてしまい
後ろのFrameLayoutの画像が消えてしまいました。

またViewのように一度描画したものを透明色で上書きするということもできていないようです。
(透明色が重ねてかかれるだけで書いてあるものが消えない)

SurfaceViewではなにか他に設定が必要なのでしょうか?

よろしくご教授願います。

河村潔広

unread,
Mar 4, 2012, 4:46:17 AM3/4/12
to android-g...@googlegroups.com
kyorohiro.androidです。

>
> SurfaceViewではなにか他に設定が必要なのでしょうか?
>
この辺りかな?
setZOrderOnTop(true)
setBackgroundDrawable(null)
setAlpha(xxx);
setFormat(PixelFormat.TRANSPARENT);

試してみた限りでは、手元で合成できた。
ただ、SurfaceViewどうしの合成しか試してないです。
それ以外は...です。

そんな感じです。

[PS]
 alpha blendingは試したことないで、解りません。

2012年3月4日11:24 KiyoKiyo <kiyo2...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>

河村潔広

unread,
Mar 4, 2012, 4:54:54 AM3/4/12
to android-g...@googlegroups.com
kyorohiro.androidです。

> [PS]
>  alpha blendingは試したことないで、解りません。
>

おっと、alpha blendingもできているッぽいです。

そんな感じです。

2012年3月4日18:46 河村潔広 <kyor...@gmail.com>:

河村潔広

unread,
Mar 4, 2012, 5:12:31 AM3/4/12
to android-g...@googlegroups.com
kyorohiro.androidです。

念のため補足します。
>
> setZOrderOnTop(true)
> setBackgroundDrawable(null)
> setAlpha(xxx);
> setFormat(PixelFormat.TRANSPARENT);
>
は SurfaceViewのメソッドです。 また、UIスレッド上で呼び出してください。
あと、バージョン2.x系からサポートされたメソッドだったと思います。

そんな感じです。

2012年3月4日18:54 河村潔広 <kyor...@gmail.com>:

KiyoKiyo

unread,
Mar 5, 2012, 7:38:28 AM3/5/12
to 日本Androidの会
KiyoKiyoです。

教えていただいた方法で透過させることができました!

どうやら必要だったのは

> setZOrderOnTop(true)

だったようです。
これによってFrameLayoutよりも上にSurfaceViewを表示することができました。

さらに
> holder.setFormat(PixelFormat.TRANSPARENT);
によって背景を透過させることで後ろにあるFramelayoyutの画像を
表示させることができました。

ありがとうございました!

河村潔広

unread,
Mar 5, 2012, 11:35:41 AM3/5/12
to android-g...@googlegroups.com
Kyorohiroです。

なんというか感想です。
正直なところ、SpriteごとにSurfaceを持つような方法が適切か
よく解っていないです。

一般的な話ではなく、私が..です。

kyorohiroは、ちょっと前に、ひとつのSurface上に複数のSpriteを組む方向で作業することに決めました。
※Androidのフレームワークに依存すると、端末依存とか出てきそうで怖かったのが理由です。あと、SurfaceViewの内部について調べる時間をケチってるというのもあります。

kiyokiyoさんが進めている方式が良い感じだとしたら、
ちょっとくやしいです。

特に意味はありません。
感想終わり。

2012年3月5日21:38 KiyoKiyo <kiyo2...@gmail.com>:

河村潔広

unread,
Mar 5, 2012, 11:49:26 AM3/5/12
to android-g...@googlegroups.com
kyorohiroです。

ちなみに、私が参考にしているのは、Starling Frameworkです
http://gamua.com/starling/

actionscriptのフレームワークです。

2012年3月6日1:35 河村潔広 <kyor...@gmail.com>:

KiyoKiyo

unread,
Mar 18, 2012, 2:57:48 AM3/18/12
to 日本Androidの会
Kiyokiyoです。

あれからいろいろ試行錯誤しましたが、
やはりkyorohiroさんの言うとおりひとつのSurfaceViewに対して描画したほうが圧倒的にスピードが速いですね。
描画スレッドが複数になるといろいろ遅くなるようで。

結局は、スプライトは個々のスレッドとして座標値だけ持つことにして、
一つの描画用SurfaceViweが描画時に一度に全てのスプライトを描画することにしました。

いろいろとアドバイス
ありがとうございました。
Reply all
Reply to author
Forward
0 new messages