フレームごとのアニメーションを実行するライブ壁紙アプリを構築しています。アプリをテストすると、アニメーションが画面に表示されますが、新しいフレームが描画される前にフレームが常にクリアされるわけではありません。
アニメーションを最後のフレームまで前方に描画し、次に最初のフレームに後方に描画するつもりです。ただし、適切な順序で続行する前に、アニメーションが 1 つまたは 2 つのフレームを前後に描画しているように見えることがあります。
この方法でリソース ID をイメージにロードします。
private int[] res_id = {R.drawable.flag_1, R.drawable.flag_2, R.drawable.flag_3, R.drawable.flag_4, R.drawable.flag_5,
R.drawable.flag_6, R.drawable.flag_7, R.drawable.flag_8, R.drawable.flag_9, R.drawable.flag_10,
R.drawable.flag_11, R.drawable.flag_12, R.drawable.flag_13, R.drawable.flag_14, R.drawable.flag_15,
R.drawable.flag_16, R.drawable.flag_17, R.drawable.flag_18, R.drawable.flag_19, R.drawable.flag_20,
R.drawable.flag_21, R.drawable.flag_22, R.drawable.flag_23, R.drawable.flag_24, R.drawable.flag_25,
R.drawable.flag_26, R.drawable.flag_27, R.drawable.flag_28, R.drawable.flag_29, R.drawable.flag_30};
画像を循環させて、次のように描画します。
void drawFlag(Canvas cFlagCanvas)
{
Bitmap bFlagFrame;
long time = 0;
if(bStartPlaying == true)
{
iFrameCount = 0;
bStartPlaying = false;
bIsPlaying = true;
//Load the first frame, decode it, and scale it to the screen.
bLenguaFrame = decodeLLResource(mContext.getResources(), res_id[iFrameCount], 400, 300);
cFlagCanvas.drawBitmap(bFlagFrame, iCenterX, iCenterY, null);
last_tick = System.currentTimeMillis();
iFrameCount++;
bLastFrame = bFlagFrame;
bFlagFrame.recycle();
}
else if (bIsPlaying == true)
{
if(iFrameCount == 0 || iFrameCount == 29)
{
iDelay = FirstLastDelay; //set to 2000 milli-seconds
}
else
{
iDelay = TweenDelay; //set to 120 milli-seconds
}
try
{
bFlagFrame = decodeResource(mContext.getResources(), res_id[iFrameCount], 400, 300);
time = (System.currentTimeMillis() - last_tick);
//Draw the next frame only if the delay time has passed.
if (time >= iDelay)
{
cFlagCanvas.drawBitmap(bFlagFrame, iCenterX, iCenterY, null);
last_tick = System.currentTimeMillis();
bLastFrame = bFlagFrame;
bFlagFrame.recycle();
//Adjust the frame count
if(bPlayingForward == true)
{
if(iFrameCount < 29)
{
iFrameCount++;
bPlayingForward = true;
}
else if(iFrameCount == 29)
{
iFrameCount--;
bPlayingForward = false;
}
}
else
{
if(iFrameCount > 0)
{
iFrameCount--;
bPlayingForward = false;
}
else if(iFrameCount == 0)
{
iFrameCount++;
bPlayingForward = true;
}
}
}
//Delay not expired. Redraw the last frame.
else
{
cFlagCanvas.drawBitmap(bLastFrame, iCenterX, iCenterY, null);
}
}
catch(Exception e)
{
}
}
}
私が得たのは、メモリに負担をかけずにロードして再生するアニメーションです。ただし、新しい画像が描画されるまで、古い画像は画面から消去されません。キャンバスに一度に 1 つのフレームしか表示されないようにするにはどうすればよいですか?
提供されたヘルプに事前に感謝します。