2016-11-04 2 views
0

FrageAlertdialog mit Blur Hintergrund in possition Zentrum

Versuchte (nicht DIM) verschwimmen die Hintergrund eines Dialog.

und FLAG_BLUR_BEHIND ist dipricated.

Ansatz ist, nehmen Sie ein Bildschirmfoto aus der Johannisbeere Ansicht und verwischen Sie es dann an den Hintergrund, wenn AlertDialog erscheint, und es funktioniert.

aber AlertDialog ist immer in der Top nicht in der Mitte. (Das Bild überprüfen)

WindowManager.LayoutParams hat keine Auswirkung nach befestigen. (Vor befestigen Sie es an den Hintergrund, alert kann Position Mitte, aber nach dem Anbringen der Unschärfe-Ansicht auf den Hintergrund AlertDialog immer nach oben gehen)

Wie kann ich meine Alert-Center auf dem Bildschirm?

Code unten ist habe ich versucht, wird jede Führung erkennt,

angezeigt Alarm, wenn ich wieder drücken.

 @Override 
     public void onBackPressed() { 

      AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this, R.style.AlertDialogCustom); 
      builder.setTitle("Lets Blur"); 
      builder.setMessage("This is Blur Demo"); 
      builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 


      dialog = builder.create(); 

// this position alert in the CENTER 
      dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
      WindowManager.LayoutParams wmlp = dialog.getWindow().getAttributes(); 
      wmlp.gravity = Gravity.CENTER; 
      dialog.show(); 

      new BlurAsyncTask().execute(); 

     } 

     class BlurAsyncTask extends AsyncTask<Void, Integer, Bitmap> { 


      protected Bitmap doInBackground(Void...arg0) { 

       Bitmap map = AppUtils.takeScreenShot(MainActivity.this); 
       Bitmap fast = new BlurView().fastBlur(map, 10); 
       return fast; 
      } 


      protected void onPostExecute(Bitmap result) { 
       if (result != null){ 
        final Drawable draw=new BitmapDrawable(getResources(),result); 
        Window window = dialog.getWindow(); 
// this position alert again in the TOP -- need to avoid that! 
        window.setBackgroundDrawable(draw); 
        window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); 
        window.setGravity(Gravity.CENTER); 
        dialog.show(); 

       } 

      } 

Andere Klassen

AppUtils

public class AppUtils { 

    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; 
    } 
} 

BlurView

public class BlurView { 

    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); 
    } 
} 

Screenshot - das ist das Ergebnis i Get- i Alarmzentrale machen wollen, aber es bleibt oben this is the result i get- i want to make it center

Edit: Concept Antwort

  1. einen Bildschirm Nehmen Schuss
  2. Programtically animieren/blur/was auch immer für diesen Screenshot
  3. Erhalten Johannisbeerfenster mit einem Dialogfeld, das keinen Inhalt hat
  4. Bildschirm screenshot h Effekt
  5. Anzeige reale Ansicht Ich wollte

Side Hinweis anzuzeigen: Damit kann jede Art von einem Hintergrund befestigen! blur .. dim..bright .. Fügen Sie einfach die richtige Methode hinzu, die eine Bitmap akzeptiert, und geben Sie eine Bitmap mit den gewünschten Änderungen in der Klasse BlurView zurück. Ich habe eine Unschärfe hinzugefügt.

+0

Was genau möchten Sie? – Piyush

+0

kann einen Screenshot hinzufügen ?? –

+0

mmm Ja, ich möchte den Alarmdialog in der Mitte halten. aber wenn ich das versuche -> window.setBackgroundDrawable (draw); es geht standardmäßig zum oberen Rand des Bildschirms –

Antwort

0

Hinweis: Dieser Bildschirm Hintergrund kann alles, was Sie drauf haben sein, ist es, was tut, ist ein Screenshot davon und Unschärfe nehmen, die schließlich als Hintergrund des alertDialog mit Unschärfe-Effekt eingestellt

Problem war alertDialog mit diesem blurhintergrund verbunden war immer an der spitze und ich konnte das nicht ändern.

Ich kam mit dieser Lösung.

ich zwei alertDialogs ist für den Unschärfe-Effekt zu verwenden hatte (für die Verwendung von getWindow()) und es bekommt Anzeige nicht jetzt (I entfernt sein setContentView/kann transparenten Hintergrund)

Der andere ist Der echte Alarmdialog wurde nach dem Unschärfeeffekt angezeigt.

MainActivity

public class MainActivity extends AppCompatActivity { 

    private AlertDialog dialogWhichDisplayAlert; 
    private Dialog fakeDialogUseToGetWindowForBlurEffect; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


    } 


    @Override 
    public void onBackPressed() { 


     fakeDialogUseToGetWindowForBlurEffect = new Dialog(MainActivity.this); 
     // fakeDialogUseToGetWindowForBlurEffect.setContentView(R.layout.fakealert); // removed the content so not visible 



     new BlurAsyncTask().execute(); 

    } 

    class BlurAsyncTask extends AsyncTask<Void, Integer, Bitmap> { 


     protected Bitmap doInBackground(Void...arg0) { 

      Bitmap map = AppUtils.takeScreenShot(MainActivity.this); 
      Bitmap fast = new BlurView().fastBlur(map, 10); 
      return fast; 
     } 


     protected void onPostExecute(Bitmap result) { 
      if (result != null){ 
       final Drawable draw=new BitmapDrawable(getResources(),result); 
       Window window = fakeDialogUseToGetWindowForBlurEffect.getWindow(); 
       window.setBackgroundDrawable(draw); 
       window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); 
       window.setGravity(Gravity.CENTER); 
       fakeDialogUseToGetWindowForBlurEffect.show(); 


       // real one 
       AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this, R.style.AlertDialogCustom); 
       builder.setTitle("Lets Blur"); 
       builder.setMessage("This is Blur Demo"); 
       builder.setCancelable(false); 
       builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         fakeDialogUseToGetWindowForBlurEffect.dismiss(); 
         dialog.cancel(); 
        } 
       }); 
       builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         fakeDialogUseToGetWindowForBlurEffect.dismiss(); 
         dialog.cancel(); 
        } 
       }); 
       dialogWhichDisplayAlert = builder.create(); 

       // position real dialogWhichDisplayAlert using Gravity.CENTER; 
       dialogWhichDisplayAlert.requestWindowFeature(Window.FEATURE_NO_TITLE); 
       WindowManager.LayoutParams wmlp = dialogWhichDisplayAlert.getWindow().getAttributes(); 
       wmlp.gravity = Gravity.CENTER; 
       dialogWhichDisplayAlert.show(); 

      } 

     } 
    } 
} 

[anderen verwendeten Klassen sind die gleichen wie die Frage]

Stil

<style name="AlertDialogCustom" parent="@android:style/Theme.Dialog"> 
     <item name="android:textColor">#00FF00</item> 
     <item name="android:typeface">monospace</item> 
     <item name="android:textSize">10sp</item> 
    </style> 

heraus gesetzt

enter image description here