3

我正在尝试创建一个动态壁纸,其动画始终以当前主屏幕页面为中心,而不会丢失扩展背景。我现在正在做的是绘制我的自定义背景位图,然后在其上绘制一些文本。

这是我的并条框方法:

        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 是我想作为墙纸绘制的位图,它的宽度是屏幕宽度的两倍。

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 回答