Androidアプリを作っていてアルファチャンネルのあるグラデーションを含むビットマップがどうしてもキレイに描画されず(縞々に見える)、しばらく悩んでいた問題が解決したのでメモ。
結論から先にまとめると
SurfaceView内でフルカラーを描画したい場合は、SurfaceHolderに色深度を指定する必要があるようです。
SurfaceViewを継承したクラスのコンストラクタあたりで
getHolder().setFormat(PixelFormat.RGBA_8888);
のように書きます。
Androidアプリでビットマップを取り扱う際に色深度を指定できるのですが
ARGB_8888:アルファチャンネル付き32ビット
ARGB_4444:アルファチャンネル付き16ビット
RGB_565:アルファチャンネル無し16ビット
グラデーションの面積が広いグラフィックやクオリティ重視の写真データなどを表示する場合はARGB_8888がマストになると思います。
Photoshopなどでノイズを乗せるとキレイに描画されるらしいのですが、画像によっては正しく表示されないようです。「ノイズを乗せる」のは簡易的にディザリングを行うことが目的だと思うのですが、アルファチャンネル付きのグラデーションには効果がありませんでした。
Androidの色深度についての解説は以下のページが詳しいですが、ビットマップデータを読み込む際にオプションを設定する必要があります。
SurfaceViewクラスは描画するエリアに色深度を設定する必要があるため、SurfaceHolderに設定する事になります(Android2.3以降はViewクラスはデフォルトで32ビットカラーらしいのですが)。
ただ、32ビットカラーのビットマップはメモリの使用量が大きく、描画のフレームレートも落ちるため、多用するとアプリごと落ちることもあるようです。
カメラアプリなどはビットマップの取り扱いが難しそうですね。