一連の ARGB ビットマップを循環させるために、SurfaceView を拡張するクラスを作成しました。これは、基礎となるビットマップの状態が (通常は常にではありませんが) 新しいフレームごとに保持されることを除いて、ほとんど機能します。
つまり、最初に表示するフレームが不透明で、後続のフレームが透明である場合、元のフレームの不透明なピクセルは、新しいフレームが描画されるときに消去されません。
SurfaceHolder.lockCanvas() のドキュメントには具体的に次のように記載されているため、この動作は私を混乱させます。
「Surface のコンテンツは、unlockCanvas() と lockCanvas() の間で保持されることはありません。このため、Surface 領域内のすべてのピクセルを書き込む必要があります。」
背景が無地の場合、canvas.drawARGB(255,0,0,0) を呼び出すと黒くクリアされますが、背景を透明にしたいのですが、背景を透明にすることはできません。 canvas.drawARGB(0,0,0,0) は効果がないためです。
import java.util.ArrayList;
import java.util.Random;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/*
* Accepts a sequence of Bitmap buffers and cycles through them.
*/
class AnimatedBufferView extends SurfaceView implements Runnable
{
Thread thread = null;
SurfaceHolder surfaceHolder;
volatile boolean running = false;
ArrayList<Bitmap> frames;
int curIndex = 0;
public AnimatedBufferView(ArrayList<Bitmap> _frames, Context context)
{
super(context);
surfaceHolder = getHolder();
frames = _frames;
}
public void onResume(){
running = true;
thread = new Thread(this);
thread.start();
}
public void onPause(){
boolean retry = true;
running = false;
while(retry){
try {
thread.join();
retry = false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void run()
{
// TODO Auto-generated method stub
while(running)
{
if(surfaceHolder.getSurface().isValid())
{
Canvas canvas = surfaceHolder.lockCanvas();
//clear the buffer?
//canvas.drawARGB(255, 0, 0, 0);
//display the saved frame-buffer..
Matrix identity = new Matrix();
Bitmap frame = frames.get(curIndex);
canvas.drawBitmap(frame, identity, null);
surfaceHolder.unlockCanvasAndPost(canvas);
curIndex = (curIndex + 1) % frames.size();
try {
thread.sleep( 100 );
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}