获取桌面壁纸作为App背景
2016-04-23 11:59
381 查看
最近做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);
}
}
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);
}
}
相关文章推荐
- 浅析Android App的相对布局RelativeLayout
- Android Intent传值
- iOS学习笔记——界面通信
- [置顶] MD5加密,java工具类 String 转变成MD5 String 详细代码,工具类Android开发必备
- Android4.4 增加屏幕旋转功能
- 聊聊的Android缓存(三)
- Android自定义view的三个构造函数理解
- Android Volley完全解析(四),带你从源码的角度理解Volley
- swift-可选值(optionals)
- Android广播BroadcastReceiver的ACTION
- iOS中时间与时间戳的转换
- Android JPush(极光推送)的使用教程
- Android之SurfaceView与View
- unity 坐标系
- Android SO逆向-多重继承
- Android源码代理模式---Binder
- GreenDao 在 Android Studio 中的配置使用 之 更新数据库
- [UIApplication sharedApplication].netwrokActivityIndicator = YES&NO
- 《Android JNI》02 对java传进来的整形参数进行操作并返回
- Android布局优化之include、merge、ViewStub的使用