0

フレームごとのアニメーションを実行するライブ壁紙アプリを構築しています。アプリをテストすると、アニメーションが画面に表示されますが、新しいフレームが描画される前にフレームが常にクリアされるわけではありません。

アニメーションを最後のフレームまで前方に描画し、次に最初のフレームに後方に描画するつもりです。ただし、適切な順序で続行する前に、アニメーションが 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 つのフレームしか表示されないようにするにはどうすればよいですか?

提供されたヘルプに事前に感謝します。

4

1 に答える 1

0

Canvas.drawColor() を使用して、各フレームを描画する前に必要な色でキャンバスをクリアするだけです ( http://developer.android.com/reference/android/graphics/Canvas.html#drawColor(int) )

于 2013-07-02T22:35:44.037 に答える