个人对android截屏效果的学习

       小弟第一次在CSDN上出贴有不对的地方希望看到本帖的大神勿喷

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

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

方法1

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

方法二

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值