获取桌面壁纸作为App背景

    最近做app领导要求所有app都要用桌面壁纸来作为app的背景图。于是写了以下代码来实现:

private void setBackground() {
try {

LinearLayout rl = (LinearLayout) findViewById(R.id.fm_main);
WallpaperManager wm = WallpaperManager.getInstance(this);
Drawable d = wm.getDrawable();

if (d != null) {

rl.setBackground(d);
} else {
rl.setBackgroundResource(R.drawable.wallpaper);
}

}

这样做当然是可以,但是发现背景图会被严重压缩,跟桌面上的壁纸效果相差太大。

用各种压缩,拉伸,裁剪都不起作用,简直要抓狂啊。后来想,launcher里面既然可以做到,为何不模仿launcher的做法呢?

于是查看launcher设置壁纸的源码,发现自定义了一个Drawable:

static class WallpaperDrawable extends Drawable {


        Bitmap mBitmap;
        int mIntrinsicWidth;
        int mIntrinsicHeight;

public void setBitmap(Bitmap bitmap) {
            mBitmap = bitmap;
            if (mBitmap == null)
                return;
            mIntrinsicWidth = mBitmap.getWidth();
            mIntrinsicHeight = mBitmap.getHeight();
        }

@Override
        public void draw(Canvas canvas) {
            if (mBitmap == null) return;
            int width = canvas.getWidth();
            int height = canvas.getHeight() ;

      int x = (width - mIntrinsicWidth) / 2;
            int y = (height - mIntrinsicHeight) / 2;
            canvas.drawBitmap(mBitmap, x, y, null);
        }

@Override
        public int getOpacity() {
            return android.graphics.PixelFormat.OPAQUE;
        }

 @Override
        public void setAlpha(int alpha) {
            // Ignore
        }


        @Override
        public void setColorFilter(ColorFilter cf) {
            // Ignore
        }

结合自己的一些代码,最终解决了背景倍压扁的问题:

// drawable转bitmap
private static Bitmap drawableToBitmap(Drawable drawable) {
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();

Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565;
Bitmap bitmap = Bitmap.createBitmap(width, height, config);
Canvas canvas = new Canvas(bitmap);

drawable.setBounds(0, 0, width, height);
drawable.draw(canvas);
return bitmap;
}

最后,修改setBackground方法:

private void setBackground() {
try {

LinearLayout rl = (LinearLayout) findViewById(R.id.fm_main);
WallpaperManager wm = WallpaperManager.getInstance(this);
Drawable d = wm.getDrawable();

if (d != null) {

Bitmap bitmap = drawableToBitmap(d);
WallpaperDrawable wd = new WallpaperDrawable();
wd.setBitmap(bitmap);

rl.setBackground(d);

} else {
rl.setBackgroundResource(R.drawable.wallpaper);
}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LakeSideHu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值