2016-11-04 17 views
0

質問(DIMない)ぼかすしようとしたAlertDialogブラーと背景

Dialogの背景。

およびFLAG_BLUR_BEHINDは、二変量である。

アプローチは、スクリーンショットをキャプチャして、ぼかしを表示します。に添付して、AlertDialogが表示され、動作します。

しかしAlertDialogは中央のトップないに常にある。前に(。

WindowManager.LayoutParamsはが添付後には効果がありません(画像をご確認ください)、背景、警告でき位置までに添付します中央に表示されますが、背景にブラービューを貼り付けた後に表示されます)

警告センターを画面に表示するにはどうすればよいですか?以下

iが試みコードである、任意のガイドが、私はバック押すと

は、警告表示、理解されるであろう。

 @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(); 

       } 

      } 

他のクラス

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

スクリーンショットは - これは私が警戒センターを作りたいGET-結果であるが、それはトップ this is the result i get- i want to make it center

編集にとどまる:

  • Programticallyがアニメーション化スクリーンショットを撮る回答者の考え方

    1. /ぼかし/そのスクリーンショットへの影響
    2. ダイアログを使用してカラントウィンドウを取得するコンテンツがありません
    3. スクリーンショットウィットを添付しますこれは、バックグラウンドのいずれかのタイプを取り付けるために使用することができます:私は

    側注を表示したい時間効果

  • 表示リアルビュー! blur .. dim .. bright ..ビットマップを受け入れる正しいメソッドを追加し、BlurViewクラスで必要な変更を加えたビットマップを返します。私はぼかし1を追加しました。

  • +0

    正確に何をしたいですか? – Piyush

    +0

    はいくつかのスクリーンショットを追加できますか? –

    +0

    mmmはい私は警告ダイアログを中央に保つことはできません。しかし、私はこれをしようとすると - > window.setBackgroundDrawable(描画);それはデフォルトで画面の上部に行く –

    答えて

    0

    注:は、この画面の背景には、どのようなそれがないと、最終的には問題がalertDialog

    ぼかし効果を持つalertDialogの背景として設定し、それのスクリーンショットやにじみをとるである、あなたはそれを持って何もすることができますそのぼやけた背景でつけられたものは常にトップにあり、私はそれを変えることができませんでした。

    私はこの解決策を考え出しました。私は2つのalertDialogs 1は、ぼかし効果について(getWindow()の使用のため)であり、それは今の表示を得ることはありません使用していた

    (私はそのsetContentView /透明な背景を使用することができます削除)

    他方があります実際のアラートダイアログは、ぼかし効果の後に表示されます。

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

    アウトが

    を入れ

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

    スタイル[使用されている他のクラスは、質問と同じです]

    enter image description here