Last Updated: February 08, 2015

Blur behind Alert Dialog

Update:

We can also use renderscript apis to blur the background for api level >= 17. Please find below github project

Github Blur Behind Dialog


Description:

As we know from API 14 the below technique to Blur the screen has been deprecated.
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

Below is the technique to help to blur background of the alert Dialog. 

So Let's get started





Step1: Take the Snapshot of Your Background using Below Code 

    public static Bitmap takeScreenShot(Activity activity) {
        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();


        Bitmap b1 = view.getDrawingCache();
        Rect frame = new Rect();
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        int statusBarHeight = frame.top;

        Display display = activity.getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        int width = size.x;
        int height = size.y;

        Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height - statusBarHeight);
        view.destroyDrawingCache();
        return b;
    }  

Step2: Call the method  Bitmap fast = fastblur(map, 10); Got it From Here

   public Bitmap fastblur(Bitmap sentBitmap, int radius) {  
     Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);  
     if (radius < 1) {  
       return (null);  
     }  
     int w = bitmap.getWidth();  
     int h = bitmap.getHeight();  
     int[] pix = new int[w * h];  
     Log.e("pix", w + " " + h + " " + pix.length);  
     bitmap.getPixels(pix, 0, w, 0, 0, w, h);  
     int wm = w - 1;  
     int hm = h - 1;  
     int wh = w * h;  
     int div = radius + radius + 1;  
     int r[] = new int[wh];  
     int g[] = new int[wh];  
     int b[] = new int[wh];  
     int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;  
     int vmin[] = new int[Math.max(w, h)];  
     int divsum = (div + 1) >> 1;  
     divsum *= divsum;  
     int dv[] = new int[256 * divsum];  
     for (i = 0; i < 256 * divsum; i++) {  
       dv[i] = (i / divsum);  
     }  
     yw = yi = 0;  
     int[][] stack = new int[div][3];  
     int stackpointer;  
     int stackstart;  
     int[] sir;  
     int rbs;  
     int r1 = radius + 1;  
     int routsum, goutsum, boutsum;  
     int rinsum, ginsum, binsum;  
     for (y = 0; y < h; y++) {  
       rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;  
       for (i = -radius; i <= radius; i++) {  
         p = pix[yi + Math.min(wm, Math.max(i, 0))];  
         sir = stack[i + radius];  
         sir[0] = (p & 0xff0000) >> 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 < w; x++) {  
         r[yi] = dv[rsum];  
         g[yi] = dv[gsum];  
         b[yi] = dv[bsum];  
         rsum -= routsum;  
         gsum -= goutsum;  
         bsum -= boutsum;  
         stackstart = stackpointer - radius + div;  
         sir = stack[stackstart % div];  
         routsum -= sir[0];  
         goutsum -= sir[1];  
         boutsum -= sir[2];  
         if (y == 0) {  
           vmin[x] = Math.min(x + radius + 1, wm);  
         }  
         p = pix[yw + vmin[x]];  
         sir[0] = (p & 0xff0000) >> 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 < w; x++) {  
       rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;  
       yp = -radius * w;  
       for (i = -radius; i <= radius; i++) {  
         yi = Math.max(0, yp) + x;  
         sir = stack[i + radius];  
         sir[0] = r[yi];  
         sir[1] = g[yi];  
         sir[2] = b[yi];  
         rbs = r1 - Math.abs(i);  
         rsum += r[yi] * rbs;  
         gsum += g[yi] * rbs;  
         bsum += b[yi] * rbs;  
         if (i > 0) {  
           rinsum += sir[0];  
           ginsum += sir[1];  
           binsum += sir[2];  
         } else {  
           routsum += sir[0];  
           goutsum += sir[1];  
           boutsum += sir[2];  
         }  
         if (i < hm) {  
           yp += w;  
         }  
       }  
       yi = x;  
       stackpointer = radius;  
       for (y = 0; y < h; y++) {  
         // Preserve alpha channel: ( 0xff000000 & pix[yi] )  
         pix[yi] = ( 0xff000000 & pix[yi] ) | ( dv[rsum] << 16 ) | ( dv[gsum] << 8 ) | dv[bsum];  
         rsum -= routsum;  
         gsum -= goutsum;  
         bsum -= boutsum;  
         stackstart = stackpointer - radius + div;  
         sir = stack[stackstart % div];  
         routsum -= sir[0];  
         goutsum -= sir[1];  
         boutsum -= sir[2];  
         if (x == 0) {  
           vmin[y] = Math.min(y + r1, hm) * w;  
         }  
         p = x + vmin[y];  
         sir[0] = r[p];  
         sir[1] = g[p];  
         sir[2] = b[p];  
         rinsum += sir[0];  
         ginsum += sir[1];  
         binsum += sir[2];  
         rsum += rinsum;  
         gsum += ginsum;  
         bsum += binsum;  
         stackpointer = (stackpointer + 1) % div;  
         sir = stack[stackpointer];  
         routsum += sir[0];  
         goutsum += sir[1];  
         boutsum += sir[2];  
         rinsum -= sir[0];  
         ginsum -= sir[1];  
         binsum -= sir[2];  
         yi += w;  
       }  
     }  
     Log.e("pix", w + " " + h + " " + pix.length);  
     bitmap.setPixels(pix, 0, w, 0, 0, w, h);  
     return (bitmap);  
   }  





Step 3: Finally just Add click listener on button.

   btnblur.setOnClickListener(new OnClickListener() {  
       @Override  
       public void onClick(View view) {  
         AlertDialog.Builder builder=new AlertDialog.Builder(BlurImageView.this,R.style.Theme_D1NoTitleDim);  
         builder.setTitle("Content");  
         builder.setMessage("CLICK OK to Exit");  
         builder.setPositiveButton("ON", new DialogInterface.OnClickListener() {  
           @Override  
           public void onClick(DialogInterface dialog, int which) {  
             dialog.cancel();  
           }  
         });  
         alert=builder.create();  
         Bitmap map=takeScreenShot(BlurImageView.this);  
         Bitmap fast=fastblur(map, 10);  
         final Drawable draw=new BitmapDrawable(getResources(),fast);  
         alert.getWindow().setBackgroundDrawable(draw);  
         alert.show();  
       }  
     });  

Output:

17 comments :

  1. Thanks for this amazing tutorial. It is very simple and useful.
    Note that (activity.getWindowManager().getDefaultDisplay().getHeight();) is now deprecated. You need to update it.

    ReplyDelete
    Replies
    1. Really Appreciated Abdelrahman El-Tamawy. The blog and the github project is updated now. https://github.com/nitiwari-dev/Blur-behind-alert-dialog #codingisanart. Pls do visit http://www.coderconsole.com for other interesting post in android.

      Delete
  2. Hi, I have been using this in my app and it's really cool to have effect like this. One more thing here how i can blur the background bit more?

    Thanks

    ReplyDelete
    Replies
    1. Try increasing the radius within the 'fastblur'method. To experiment you can have a seekbar that would be fun to watch. I have updated the code on github.

      Delete
  3. how to set black color to blur

    ReplyDelete
  4. adhura q btaya hua h yr ye kaha se aya?
    back_dim_layout.setVisibility(View.GONE);
    back_dim_layout

    ReplyDelete
  5. สหพันธ์ฟุตบอลระหว่างประเทศไฟเขียวให้ ไอเมอริค ลาปอร์ต ปราการหลังจาก สโมสรฟุตบอลแมนเชสเตอร์ ซิตี้ แห่งศึก ฟุตบอลพรีเมียร์ลีกอังกฤษ เปลี่ยนจากการเป็นตัวแทนทีมชาติ ฝรั่งเศส ไปรับใช้ทีมชาติ สเปน ได้ ทำให้เซ็นเตอร์แบ็ควัย 26 ปีจ่อลงเล่นใน ยูโร 2020 นี้กับทัพ กระทิงดุ... ufa

    ReplyDelete
  6. Baccarat is money making and it's spectacular availability. The best In your case it's found that you will find quite interesting options. And that is thought to be a thing that's rather varied And it's very something that's rather prepared to strike with Probably the most good, as well, is a genuinely good option. Moreover, it's a truly interesting alternative. It's the simplest way which could generate profits. Superbly ready The number of best-earning baccarat will be the accessibility of making by far the most money. As much as achievable is very ideal for you An alternative which could be guaranteed. To a wide variety of supply and performance And find out excellent benefits also..บาคาร่า
    ufa
    ufabet
    แทงบอล
    แทงบอล
    แทงบอล

    ReplyDelete
  7. pgslot ซึ่งเกมคาสิโนออนไลน์เกมนี้เป็นเกมที่เรียกว่าเกม สล็อตเอ็กซ์โอ คุณรู้จักเกมส์เอ็กซ์โอหรือไม่ 90% ต้องรู้จักเกมส์เอ็กซ์โออย่างแน่นอนเพราะในตอนนี้เด็กนั้นเราทุกคนมักที่จะเอาก็ได้ขึ้นมา สล็อต เล่นเกมส์เอ็กซ์โอกับเพื่อนเพื่อนแล้วคุณรู้หรือไม่ว่าในปัจจุบันนี้เกมส์เอ็กซ์โอนั้นกลายมาเป็นเกมซะลอสออนไลน์ที่ให้บริการด้วยเว็บคาสิโนออนไลน์คุณสามารถเดิมพันเกมส์เอ็กซ์โอกับเว็บคาสิโนออนไลน์ได้โดยที่จะทำให้คุณนั้นสามารถสร้างกำไรจากการเล่นเกมส์เดิมพันออนไลน์ได้เราแนะนำเกมส์ชนิดนี้ให้คุณได้รู้จักก็เพราะว่าเชื่อว่าทุก

    ReplyDelete
  8. Our drivers have undergone top security companies in London
    thorough training to enable them to have the ability to deal with a variety of situations such as the presence of overzealous fans or media, a disgruntled crowd, car-jacking, armed ambush, or kidnap.

    ReplyDelete
  9. Thanks for letting us know about it, you can check out the other version of it. It will provide you complete apk file with unlock features. kinemaster without watermark apk download

    ReplyDelete
  10. Good ・I really should definitely articulate, fascinated with all your web site. https://www.allmaxbet.com

    ReplyDelete
  11. Thanks for sharing this information! I totally agree with you. Your information is very interesting and important. I really like this information.

    Want to launch On-Demand Food Delivery App? The App Ideas provides best on-demand food delivery app development solution. Contact us now!

    ReplyDelete

Your comments are valuable for us !!!