3

拡張された背景を失うことなく、常に現在のホーム画面ページの中心にアニメーションがあるライブ壁紙を作成しようとしています。私が今行っているのは、カスタム背景ビットマップを描画し、その上にテキストを描画することです。

これは私の drawframe メソッドです:

        final SurfaceHolder holder = getSurfaceHolder();
        Canvas canvas = null;
        try {
            canvas = holder.lockCanvas();
            if (canvas != null) {

                if(mBackgroundBitmap != null) {
                    canvas.drawBitmap(mBackgroundBitmap, 0, 0, null);
                } else {
                    canvas.drawColor(Color.BLACK);
                }
                drawText(canvas);
            }
        }
        finally {
            if (canvas != null ) holder.unlockCanvasAndPost(canvas);
        }

それは機能しますが、ホームスクリーンのページを変更すると、大きな壁紙を使用するときのような別の「部分」ではなく、固定された背景画像が表示されます。

キャンバスをロックする前に壁紙を設定しようとしましたが、期待どおりに機能しません:

if(mBackgroundBitmap != null) {                 
                try {
                    setWallpaper(mBackgroundBitmap);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
final SurfaceHolder holder = getSurfaceHolder();
    Canvas canvas = null;
    try {
        canvas = holder.lockCanvas();
        if (canvas != null) {
            drawText(canvas);
        }
    }
    finally {
        if (canvas != null ) holder.unlockCanvasAndPost(canvas);
    }

ホーム画面のページを変更するときに大きな背景「モバイル」を維持し、現在のページの中央にアニメーションを追加するにはどうすればよいですか?

4

1 に答える 1

3

解決方法がわかりました!

    void drawFrame() {
        final SurfaceHolder holder = getSurfaceHolder();

        Canvas canvas = null;
        try {
            canvas = holder.lockCanvas();
            if (canvas != null) {
                canvas.save();
                canvas.translate((float) mxOffset, 0f);

                if(mBackgroundBitmap != null) {
                    canvas.drawBitmap(mBackgroundBitmap, 0, 0, null);
                }

                canvas.restore();
            }
        }
        finally {
            if (canvas != null ) holder.unlockCanvasAndPost(canvas);
        }
    }

mBackgroundBitmap は、壁紙として描画したいビットマップで、その幅は画面幅の 2 倍です。

mxOffsets は、オーバーライドされた onOffsetsChanged で取得されます。

    @Override
    public void onOffsetsChanged(float xOffset, float yOffset,
            float xOffsetStep, float yOffsetStep, int xPixelOffset,
            int yPixelOffset) {
        super.onOffsetsChanged(mxOffset, yOffset, xOffsetStep, yOffsetStep,
                xPixelOffset, yPixelOffset);

        mxOffset = xPixelOffset;
        drawFrame();
    }
于 2012-06-15T12:56:18.050 に答える