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:

16 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. Great Article IoT Projects for Students

      Deep Learning Projects for Final Year

      JavaScript Training in Chennai

      JavaScript Training in Chennai

      The Angular Training covers a wide range of topics including Components, Angular Directives, Angular Services, Pipes, security fundamentals, Routing, and Angular programmability. The new Angular TRaining will lay the foundation you need to specialise in Single Page Application developer. Angular Training

      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. I have been searching for a useful post like this on salesforce course details, it is highly helpful for me and I have a great experience with this Salesforce Training who are providing certification and job assistance. Salesforce training in Noida

    ReplyDelete
  6. อีกทั้งเรายังให้บริการ เกมสล็อต ยิงปลา แทงบอลออนไลน์ รองรับทุกการใช้งานในอุปกรณ์ต่าง ๆ HTML5 คอมพิวเตอร์ แท็บเล็ต สมาทโฟน คาสิโนออนไลน์ และมือถือทุกรุ่น เล่นได้ตลอด 24ชม. ไม่ต้อง Downloads เกมส์ให้ยุ่งยาก ด้วยระบบที่เสถียรที่สุดในประเทศไทย

    ReplyDelete
  7. หาคุณกำลังหาเกมส์ออนไลน์ที่สามารถสร้างรายได้ให้กับคุณ เรามีเกมส์แนะนำ เกมยิงปลา รูปแบบใหม่เล่นง่ายบนมือถือ คาสิโนออนไลน์ บนคอม เล่นได้ทุกอุปกรณ์รองรับทุกเครื่องมือ มีให้เลือกเล่นหลายเกมส์ เล่นได้ทั่วโลกเพราะนี้คือเกมส์ออนไลน์แบบใหม่ เกมยิงปลา

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

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

    ReplyDelete

Your comments are valuable for us !!!