Android Launcher3获取壁纸作为左屏背景 并实现毛玻璃效果

在Launcher.java中(实现左屏的方法详见https://mp.csdn.net/postedit/80192206)

在oncreate()中

 /*wanchengguo 负一屏加载布局 20180424 begin*/
        WallpaperManager mWallpaperManager = WallpaperManager.getInstance(getApplicationContext());
        /*wanchengguo 负一屏加载布局 20180424 end*/

新建方法    

private void setBackgroundScreen() {

    //setBackNegative(int x, int y, int width, int height) 
    DisplayMetrics dm = this.getResources().getDisplayMetrics();
int width = dm.widthPixels;

int height = dm.heightPixels;//获取屏幕的高宽

    //ll_main 是左屏的主控件     

    ll_main.setBackgroundDrawable(setBackNegative(0,0,width,height));// //起始的X Y 要截的图的宽度  要截的图的高度

    }

    public Drawable  setBackNegative(int x,int y,int width,int height) {
    WallpaperInfo wallpaperInfo = mWallpaperManager.getWallpaperInfo(); 
   
    Bitmap mBackground = null;
    if(wallpaperInfo != null) {//判断是静态还是动态壁纸
   
    }else {
    mBackground = mWallpaperManager.getBitmap();//获取当前桌面处理后的壁纸  ~静态壁纸
   
    }
   
    Bitmap result = Bitmap.createBitmap(mBackground, x,y,width,height, null, false);//根据屏幕大小,以及view长宽,裁剪当前桌面壁纸   起始的X Y 要截的图的宽度  要截的图的高度
    Drawable drawable = FastBlur.doBlur(result);//高斯模糊  FastBlur 自己新建的类 在文章后面贴出
    return drawable ;

    }

壁纸变化更新背景

 private BroadcastReceiver WallpaperIntentReceiver = new BroadcastReceiver() {
//监听壁纸更换的广播
  @Override
  public void onReceive(Context context, Intent intent) {
  String action = intent.getAction();
  //Intent.ACTION_WALLPAPER_CHANGED
  android.util.Log.i("wcg","更换了壁纸");
 
  setBackgroundScreen();
           
  }
  };

在oncreate()中

 //注册壁纸切换的广播 wanchengguo 20180427 begin

        
        IntentFilter intentFilter_wallpaper = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED);
        registerReceiver(WallpaperIntentReceiver, intentFilter_wallpaper);

        //注册壁纸切换的广播 wanchengguo 20180427 end

/*毛玻璃模糊效果类:*/
public class FastBlur {
private static final float BLUR_RADIUS = 10.0f;

public static Drawable doBlur(Bitmap sentBitmap) {
int radius = (int)BLUR_RADIUS ;
Bitmap bitmap = sentBitmap;



if (radius < 1) {
return (null);
}


int w = bitmap.getWidth();
int h = bitmap.getHeight();


int[] pix = new int[w * h];
bitmap.getPixels(pix, 0, w, 0, 0, w, h);


int wm = w - 1;
int hm = h - 1;
int wh = w * h;
int div = radius + radius + 1;


int r[] = new int[wh];
int g[] = new int[wh];
int b[] = new int[wh];
int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
int vmin[] = new int[Math.max(w, h)];


int divsum = (div + 1) >> 1;
divsum *= divsum;
int dv[] = new int[256 * divsum];
for (i = 0; i < 256 * divsum; i++) {
dv[i] = (i / divsum);
}


yw = yi = 0;


int[][] stack = new int[div][3];
int stackpointer;
int stackstart;
int[] sir;
int rbs;
int r1 = radius + 1;
int routsum, goutsum, boutsum;
int rinsum, ginsum, binsum;


for (y = 0; y < h; y++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
for (i = -radius; i <= radius; i++) {
p = pix[yi + Math.min(wm, Math.max(i, 0))];
sir = stack[i + radius];
sir[0] = (p & 0xff0000) >> 16;
sir[1] = (p & 0x00ff00) >> 8;
sir[2] = (p & 0x0000ff);
rbs = r1 - Math.abs(i);
rsum += sir[0] * rbs;
gsum += sir[1] * rbs;
bsum += sir[2] * rbs;
if (i > 0) {
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
} else {
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
}
}
stackpointer = radius;


for (x = 0; x < w; x++) {


r[yi] = dv[rsum];
g[yi] = dv[gsum];
b[yi] = dv[bsum];


rsum -= routsum;
gsum -= goutsum;
bsum -= boutsum;


stackstart = stackpointer - radius + div;
sir = stack[stackstart % div];


routsum -= sir[0];
goutsum -= sir[1];
boutsum -= sir[2];


if (y == 0) {
vmin[x] = Math.min(x + radius + 1, wm);
}
p = pix[yw + vmin[x]];


sir[0] = (p & 0xff0000) >> 16;
sir[1] = (p & 0x00ff00) >> 8;
sir[2] = (p & 0x0000ff);


rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];


rsum += rinsum;
gsum += ginsum;
bsum += binsum;


stackpointer = (stackpointer + 1) % div;
sir = stack[(stackpointer) % div];


routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];


rinsum -= sir[0];
ginsum -= sir[1];
binsum -= sir[2];


yi++;
}
yw += w;
}
for (x = 0; x < w; x++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
yp = -radius * w;
for (i = -radius; i <= radius; i++) {
yi = Math.max(0, yp) + x;


sir = stack[i + radius];


sir[0] = r[yi];
sir[1] = g[yi];
sir[2] = b[yi];


rbs = r1 - Math.abs(i);


rsum += r[yi] * rbs;
gsum += g[yi] * rbs;
bsum += b[yi] * rbs;


if (i > 0) {
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
} else {
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
}


if (i < hm) {
yp += w;
}
}
yi = x;
stackpointer = radius;
for (y = 0; y < h; y++) {
// Preserve alpha channel: ( 0xff000000 & pix[yi] )
pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16)
| (dv[gsum] << 8) | dv[bsum];


rsum -= routsum;
gsum -= goutsum;
bsum -= boutsum;


stackstart = stackpointer - radius + div;
sir = stack[stackstart % div];


routsum -= sir[0];
goutsum -= sir[1];
boutsum -= sir[2];


if (x == 0) {
vmin[y] = Math.min(y + r1, hm) * w;
}
p = x + vmin[y];


sir[0] = r[p];
sir[1] = g[p];
sir[2] = b[p];


rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];


rsum += rinsum;
gsum += ginsum;
bsum += binsum;


stackpointer = (stackpointer + 1) % div;
sir = stack[stackpointer];


routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];


rinsum -= sir[0];
ginsum -= sir[1];
binsum -= sir[2];


yi += w;
}
}


bitmap.setPixels(pix, 0, w, 0, 0, w, h);
//Bitmap cc = roundBitmapByShader(bitmap,bitmap.getWidth(),bitmap.getWidth(),25);
Drawable drawable = new BitmapDrawable(bitmap);
return (drawable);
}
/**
     * 利用BitmapShader绘制圆角图片
     *
     * @param bitmap
     *              待处理图片
     * @param outWidth
     *              结果图片宽度,一般为控件的宽度
     * @param outHeight
     *              结果图片高度,一般为控件的高度
     * @param radius
     *              圆角半径大小
     * @return
     *              结果图片
     */
    private static Bitmap roundBitmapByShader(Bitmap bitmap, int outWidth, int outHeight, int radius) {
        if(bitmap == null) {
            throw new NullPointerException("Bitmap can't be null");
        }
        android.util.Log.i("wanchengguo","587bitmap.getWidth()="+bitmap.getWidth());
        // 初始化缩放比
        float widthScale = outWidth * 1.0f / bitmap.getWidth();
        float heightScale = outHeight * 1.0f / bitmap.getHeight();
        Matrix matrix = new Matrix();
        matrix.setScale(widthScale, heightScale);
        
        // 初始化绘制纹理图
        BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        
        // 根据控件大小对纹理图进行拉伸缩放处理
        bitmapShader.setLocalMatrix(matrix);


        // 初始化目标bitmap
        Bitmap targetBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888);


        // 初始化目标画布
        Canvas targetCanvas = new Canvas(targetBitmap);


        // 初始化画笔
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setShader(bitmapShader);


        // 利用画笔将纹理图绘制到画布上面
        targetCanvas.drawRoundRect(new RectF(0, 0, outWidth, outWidth), radius, radius, paint);
       
        
        return targetBitmap;
    }




}

猜你喜欢

转载自blog.csdn.net/qingcai_yuanzi/article/details/80192445