android dialog背景模糊化效果实现方法
最近做项目有这样的需求:在activity中启动一个dialog时,启动的dialog的背景设为启动acitivity的模糊化图片.
实现思路:
1.截屏,获取当前activity的界面
2.将获取的照片进行模糊化
3.将模糊化的图片设为dialog的背景
1.截屏,获取当前activity的界面
privateBitmaptakeScreenShot(Activityactivity){
Viewview=activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmapb1=view.getDrawingCache();
//获取屏幕长和高
intwidth=activity.getResources().getDisplayMetrics().widthPixels;
intheight=activity.getResources().getDisplayMetrics().heightPixels;
Bitmapbmp=Bitmap.createBitmap(b1,0,0,width,height);
view.destroyDrawingCache();
returnbmp;
}
这里需要注意:默认dialog是全屏,activity也是全屏没有状态栏.如果有状态栏需要获取状态栏大小,在创建图片的时候减去状态栏大小.
2.将获取的图片进行模糊化,这里的模糊算法,是从网上查到,具体是进行高斯模糊.具体代码在下面的工具类中.
3.设置模糊图片为dialog的背景
//blurBackgroundDrawer为模糊后的背景图片 Windowwindow=getWindow(); window.setBackgroundDrawable(newBitmapDrawable(mContext.getResources(),blurBackgroundDrawer));
注意:模糊化图片可能会比较慢,刚开始测得时候在3-4秒之间,解决办法是将获取到的屏幕进行缩小,然后在进行模糊,模糊完后,再将图片放大.
下面是将背景模糊化效果封装成的工具类代码,使用方法:只需要将其考到工程中,在需要模糊化效果的地方调用:
Bitmapbmp=getBlurBackgroundDrawer(activity);即可.
publicclassFastBlurUtility{
/**
*获得模糊化的背景图片
*@paramactivity获取模糊化的背景activity
*@return模糊化的背景图片
*/
publicstaticBitmapgetBlurBackgroundDrawer(Activityactivity){
Bitmapbmp=takeScreenShot(activity);
returnstartBlurBackground(bmp);
}
/**
*截屏
*@paramactivity截屏的activity
*@return截屏图片
*/
privatestaticBitmaptakeScreenShot(Activityactivity){
Viewview=activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmapb1=view.getDrawingCache();
//获取屏幕长和高
intwidth=activity.getResources().getDisplayMetrics().widthPixels;
intheight=activity.getResources().getDisplayMetrics().heightPixels;
Bitmapbmp=Bitmap.createBitmap(b1,0,0,width,height);
view.destroyDrawingCache();
returnbmp;
}
privatestaticBitmapstartBlurBackground(Bitmapbkg){
longstartMs=System.currentTimeMillis();
floatradius=20;//模糊程度
Bitmapoverlay=fastblur(small(bkg),(int)radius);
Log.i("FastBlurUtility","=====blurtime:"+(System.currentTimeMillis()-startMs));
returnbig(overlay);
}
/**
*放大图片
*@parambitmap需要放大的图片
*@return放大的图片
*/
privatestaticBitmapbig(Bitmapbitmap){
Matrixmatrix=newMatrix();
matrix.postScale(4f,4f);
BitmapresizeBmp=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
returnresizeBmp;
}
/**
*缩小图片
*@parambitmap需要缩小的图片
*@return缩小的图片
*/
privatestaticBitmapsmall(Bitmapbitmap){
Matrixmatrix=newMatrix();
matrix.postScale(0.25f,0.25f);
BitmapresizeBmp=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
returnresizeBmp;
}
/**
*将图片模糊化
*@paramsentBitmap需要模糊的图片
*@paramradius模糊程度
*@return模糊后的图片
*/
privatestaticBitmapfastblur(BitmapsentBitmap,intradius){
Bitmapbitmap=sentBitmap.copy(sentBitmap.getConfig(),true);
if(radius<1){
return(null);
}
intw=bitmap.getWidth();
inth=bitmap.getHeight();
int[]pix=newint[w*h];
bitmap.getPixels(pix,0,w,0,0,w,h);
intwm=w-1;
inthm=h-1;
intwh=w*h;
intdiv=radius+radius+1;
intr[]=newint[wh];
intg[]=newint[wh];
intb[]=newint[wh];
intrsum,gsum,bsum,x,y,i,p,yp,yi,yw;
intvmin[]=newint[Math.max(w,h)];
intdivsum=(div+1)>>1;
divsum*=divsum;
intdv[]=newint[256*divsum];
for(i=0;i<256*divsum;i++){
dv[i]=(i/divsum);
}
yw=yi=0;
int[][]stack=newint[div][3];
intstackpointer;
intstackstart;
int[]sir;
intrbs;
intr1=radius+1;
introutsum,goutsum,boutsum;
intrinsum,ginsum,binsum;
for(y=0;y>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>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;x0){
rinsum+=sir[0];
ginsum+=sir[1];
binsum+=sir[2];
}else{
routsum+=sir[0];
goutsum+=sir[1];
boutsum+=sir[2];
}
if(i
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。