自从iOS系统引入了Blur效果,也就是所谓的毛玻璃、模糊化效果,磨砂效果,各大系统就开始竞相模仿,这是怎样的一个效果呢,我们先来看一下,如下面的图片:

效果我们知道了,如何在Android中实现呢,说白了就是对图片进行模糊化处理,小编先给大家讲一下Android高级模糊技术的原理,如下:

·首先我创建了一个空的bitmap,把背景的一部分复制进去,之后我会对这个bitmap进行模糊处理并设置为TextView的背景。

·通过这个bitmap保存Canvas的状态;

·在父布局文件中把Canvas移动到TextView的位置;

·把ImageView的内容绘到bitmap中;

·此时,我们就有了一个和TextView一样大小的bitmap,它包含了ImageView的一部分内容,也就是TextView背后一层布局的内容;

·创建一个Renderscript的实例;

·把bitmap复制一份到Renderscript需要的数据片中;

·创建Renderscript模糊处理的实例;

·设置输入,半径范围然后进行模糊处理;

·把处理后的结果复制回之前的bitmap中;

·好了,我们已经把bitmap惊醒模糊处理了,可以将它设置为TextView背景了;

我最近在做一款App,其中有一个功能需要对图片处理实现毛玻璃的特效,经过一番研究,找到了3中实现方案,其中各有优缺点,如果系统的api在16以上,可以使用系统提供的方法直接处理图片,但是小编认为下边的解决方案是实现效果最好的。

代码如下:

[java] view plain copy
  1. publicBitmapfastblur(Contextcontext,BitmapsentBitmap,intradius){
  2. Bitmapbitmap=sentBitmap.copy(sentBitmap.getConfig(),true);
  3. if(radius<1){
  4. return(null);
  5. }
  6. intw=bitmap.getWidth();
  7. inth=bitmap.getHeight();
  8. int[]pix=newint[w*h];
  9. bitmap.getPixels(pix,0,w,0,0,w,h);
  10. intwm=w-1;
  11. inthm=h-1;
  12. intwh=w*h;
  13. intdiv=radius+radius+1;
  14. intr[]=newint[wh];
  15. intg[]=newint[wh];
  16. intb[]=newint[wh];
  17. intrsum,gsum,bsum,x,y,i,p,yp,yi,yw;
  18. intvmin[]=newint[Math.max(w,h)];
  19. intdivsum=(div+1)>>1;
  20. divsum*=divsum;
  21. inttemp=256*divsum;
  22. intdv[]=newint[temp];
  23. for(i=0;i<temp;i++){
  24. dv[i]=(i/divsum);
  25. }
  26. yw=yi=0;
  27. int[][]stack=newint[div][3];
  28. intstackpointer;
  29. intstackstart;
  30. int[]sir;
  31. intrbs;
  32. intr1=radius+1;
  33. introutsum,goutsum,boutsum;
  34. intrinsum,ginsum,binsum;
  35. for(y=0;y<h;y++){
  36. rinsum=ginsum=binsum=routsum=goutsum=boutsum=rsum=gsum=bsum=0;
  37. for(i=-radius;i<=radius;i++){
  38. p=pix[yi+Math.min(wm,Math.max(i,0))];
  39. sir=stack[i+radius];
  40. sir[0]=(p&0xff0000)>>16;
  41. sir[1]=(p&0x00ff00)>>8;
  42. sir[2]=(p&0x0000ff);
  43. rbs=r1-Math.abs(i);
  44. rsum+=sir[0]*rbs;
  45. gsum+=sir[1]*rbs;
  46. bsum+=sir[2]*rbs;
  47. if(i>0){
  48. rinsum+=sir[0];
  49. ginsum+=sir[1];
  50. binsum+=sir[2];
  51. }else{
  52. routsum+=sir[0];
  53. goutsum+=sir[1];
  54. boutsum+=sir[2];
  55. }
  56. }
  57. stackpointer=radius;
  58. for(x=0;x<w;x++){
  59. r[yi]=dv[rsum];
  60. g[yi]=dv[gsum];
  61. b[yi]=dv[bsum];
  62. rsum-=routsum;
  63. gsum-=goutsum;
  64. bsum-=boutsum;
  65. stackstart=stackpointer-radius+div;
  66. sir=stack[stackstart%div];
  67. routsum-=sir[0];
  68. goutsum-=sir[1];
  69. boutsum-=sir[2];
  70. if(y==0){
  71. vmin[x]=Math.min(x+radius+1,wm);
  72. }
  73. p=pix[yw+vmin[x]];
  74. sir[0]=(p&0xff0000)>>16;
  75. sir[1]=(p&0x00ff00)>>8;
  76. sir[2]=(p&0x0000ff);
  77. rinsum+=sir[0];
  78. ginsum+=sir[1];
  79. binsum+=sir[2];
  80. rsum+=rinsum;
  81. gsum+=ginsum;
  82. bsum+=binsum;
  83. stackpointer=(stackpointer+1)%div;
  84. sir=stack[(stackpointer)%div];
  85. routsum+=sir[0];
  86. goutsum+=sir[1];
  87. boutsum+=sir[2];
  88. rinsum-=sir[0];
  89. ginsum-=sir[1];
  90. binsum-=sir[2];
  91. yi++;
  92. }
  93. yw+=w;
  94. }
  95. for(x=0;x<w;x++){
  96. rinsum=ginsum=binsum=routsum=goutsum=boutsum=rsum=gsum=bsum=0;
  97. yp=-radius*w;
  98. for(i=-radius;i<=radius;i++){
  99. yi=Math.max(0,yp)+x;
  100. sir=stack[i+radius];
  101. sir[0]=r[yi];
  102. sir[1]=g[yi];
  103. sir[2]=b[yi];
  104. rbs=r1-Math.abs(i);
  105. rsum+=r[yi]*rbs;
  106. gsum+=g[yi]*rbs;
  107. bsum+=b[yi]*rbs;
  108. if(i>0){
  109. rinsum+=sir[0];
  110. ginsum+=sir[1];
  111. binsum+=sir[2];
  112. }else{
  113. routsum+=sir[0];
  114. goutsum+=sir[1];
  115. boutsum+=sir[2];
  116. }
  117. if(i<hm){
  118. yp+=w;
  119. }
  120. }
  121. yi=x;
  122. stackpointer=radius;
  123. for(y=0;y<h;y++){
  124. pix[yi]=(0xff000000&pix[yi])|(dv[rsum]<<16)
  125. |(dv[gsum]<<8)|dv[bsum];
  126. rsum-=routsum;
  127. gsum-=goutsum;
  128. bsum-=boutsum;
  129. stackstart=stackpointer-radius+div;
  130. sir=stack[stackstart%div];
  131. routsum-=sir[0];
  132. goutsum-=sir[1];
  133. boutsum-=sir[2];
  134. if(x==0){
  135. vmin[y]=Math.min(y+r1,hm)*w;
  136. }
  137. p=x+vmin[y];
  138. sir[0]=r[p];
  139. sir[1]=g[p];
  140. sir[2]=b[p];
  141. rinsum+=sir[0];
  142. ginsum+=sir[1];
  143. binsum+=sir[2];
  144. rsum+=rinsum;
  145. gsum+=ginsum;
  146. bsum+=binsum;
  147. stackpointer=(stackpointer+1)%div;
  148. sir=stack[stackpointer];
  149. routsum+=sir[0];
  150. goutsum+=sir[1];
  151. boutsum+=sir[2];
  152. rinsum-=sir[0];
  153. ginsum-=sir[1];
  154. binsum-=sir[2];
  155. yi+=w;
  156. }
  157. }
  158. bitmap.setPixels(pix,0,w,0,0,w,h);
  159. return(bitmap);
  160. }

更多相关文章

  1. Android-几行代码通知系统自动安装apk
  2. Android(安卓)ProgressBar详解以及自定义
  3. Android中的进程保活(不死进程)
  4. Android(安卓)OpenGL ES 从入门到精通系统性学习教程
  5. android音乐播放器-------使用android系统自带的数据库
  6. Android(安卓)64bit系统中app以32bit运行
  7. 你真的相信Android手机有加速秘技?这三个旧习惯该改改了
  8. 【react-natvie】react-native Android(安卓)webview下h5使用rem
  9. 实践中探索Android智能手机系统------APK程序安装

随机推荐

  1. Android(安卓)实现微信分享好友和朋友圈
  2. Android实现List存储到SharedPreferences
  3. android 程序的签名
  4. Android的消息处理机制—Looper,Handler,
  5. android rxjava框架 1.0 操作符介绍
  6. Android(安卓)productFlavors 差异化打包
  7. Android(安卓)4.0 Ice Cream Sandwich 带
  8. Galaxy S8及S+全屏显示适配
  9. android开发教程(十一)——android应用程
  10. 我在51CTO的第一篇博客--关于6个小时调试