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;x 0){ rinsum+=sir[0]; ginsum+=sir[1]; binsum+=sir[2]; }else{ routsum+=sir[0]; goutsum+=sir[1]; boutsum+=sir[2]; } if(i 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。