最近工作中做到了一个这样的需求,大约就是通过点击按钮把当前屏幕上显示的内容有晒剪的显示在按钮的前一层背景图上并做出模糊效果来,现在基本完成了不过其中还有很多可以改进的地方所以先记录一下以便以后想要抽象整理方法忘了。好了下面先说我的方法吧。

Activity我加了好多循环Animation所以每次截取的显示内容都不同)

方法1:

Bitmapbitmap_1=Bitmap.createBitmap(this.getWindowManager().getDefaultDisplay().getWidth(),
this.getWindowManager().getDefaultDisplay().getHeight(),Bitmap.Config.ARGB_8888);
Canvascanvas_1=new Canvas(bitmap_1);
Viewview = activity.getWindow().getDecorView(); 
view.draw(canvas_1);
方法2:
通过如下代码:
Viewview = activity.getWindow().getDecorView();
 view.setDrawingCacheEnabled(true); 
 view.buildDrawingCache();
 Bitmap bitmap_1 = view.getDrawingCache();

 Canvascanvas_1=new Canvas(bitmap_1);

上面的两种方法中的activity的获取我还没有解决,如果有大神看到这里不妨留下个activity的方法,我这里纠结了好久网上也没找到解决方法,所以直接把view给定义成全局的FrameLayout然后每次直接调用的时候直接把这个view赋过去就ok了。

这样就可以得到一个当前activity的显示内容的位图了,然后只要把这个位图转化成一个drawable就可以传递给一个布局当作背景图片了。

本人选择的是方法2,因为之后想要添加模糊效果的时候它似乎更省内存的开销(个人认为是这样的,方法1需要先draw一次然后再申请一个bitmap_2和Canvas_2然后再把刚才画的bitmap_1重新绘制在canvas_2上,所以可能需要第二种方法的两倍开销)。

好的下面开始添加模糊效果,直接上我的代码了。

privateBitmap takeScreenShot(FrameLayout view){
 intchildCount=view.getChildCount();
 Bitmap b1=null;
 Canvasc1=null;
 Paint p1=newPaint();
 b1=Bitmap.createBitmap(this.getWindowManager().getDefaultDisplay().getWidth(),this.getWindowManager().getDefaultDisplay().getHeight(),Bitmap.Config.ARGB_8888);
 c1=newCanvas(b1);
 MaskFilter ma=new BlurMaskFilter(400.05F,Blur.NORMAL);
 p1.setMaskFilter(ma);
 c1.drawColor(0XFFFFFFFF);
 for(inti=0;i<childCount-2;i++){
 View view2 =newView(view.getContext());
 view2=view.getChildAt(i);
 inttop=view2.getTop();
 int bot=view2.getBottom();
 intlef=view2.getLeft();
 int rig=view2.getRight();
 Rect rect=newRect(lef,top,rig,bot);
 view2.setDrawingCacheEnabled(true);
 view2.buildDrawingCache(); 
 Bitmap ttbit =view2.getDrawingCache(); 
 c1.drawBitmap(ttbit, null, rect,p1);
 view2.destroyDrawingCache(); 
 }
 returnb1;


}这里其实并不是我想要的模糊效果,因为android的api提供的这个BlurMaskFilter貌似只能从做边缘的模糊效果,并非我理想中的全屏模糊效果。网上咨询了朋友其实一般做的模糊只是在当前的图片上方重新画制一个类似于毛玻璃一样的版透明的东西让人感觉是模糊了,可是这个跟我得到的需求图上的效果不一样,图片上就是明确的内容模糊了,这让我很纠结,想了想还有两种方法去做但还没有做,笔者在此先写个想法

方法1:

通过.drawBitmap(ttbit,null, rect,p1);的第二个参数修改显示的内容把这个图片分几块显示然后每块都做模糊效果这样模糊效果就明显多了,不过感觉资源浪费问题貌似可能会很严重

方法二

view.getChildAt(intcount);之后再取得的子view再得到每个小的子view然后分别做模糊效果,不过因为我程序中各种布局各种自定义view所以还没有干尝试回头有时间把这个方法整合一下然后抽象出来再发