【问题标题】:Live Wallpaper and extended background动态壁纸和扩展背景
【发布时间】:2012-06-04 16:43:31
【问题描述】:

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

这是我的画框方法:

        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);
    }

如何在更改主屏幕页面时保持大背景“移动”,但添加一些在当前页面居中的动画?

【问题讨论】:

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


    【解决方案1】:

    我已经找到解决方法了!

        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();
        }
    

    【讨论】:

    • 嗨。实际上我正在做同样的事情,但我希望动画出现在所有主屏幕页面中。如何实现。你有什么建议吗?
    • @anuja 只需将您的 mxOffset 也添加到动画中,而不仅仅是添加到背景中
    • 嗨,santacrab,我已经完成了你在我的代码中所说的操作,它在 GO LAUNCHER 主屏幕上运行良好,但是当我从 GO LAUNCHER 主屏幕切换到我的原生 android 主屏幕时,我的动态壁纸停止视差滚动。请帮我解决这个问题
    • @himanshu 可能您的本地主屏幕不支持“扩展”背景功能。由于我在很多设备上工作,我经常遇到那种主屏幕。要知道他们是否支持它,通常尝试使用本机壁纸选择器选择背景图像并检查它是否允许裁剪宽高比与显示尺寸不同的图像就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多