动态壁纸和扩展背景

时间:2012-05-30 12:35:49

标签: android bitmap android-canvas live-wallpaper wallpaper

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

这是我的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);
    }

在更改主屏幕页面时,我可以做些什么来保留大背景“移动”,但是在当前页面中添加一些动画?

1 个答案:

答案 0 :(得分: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();
    }