2016-11-04 10 views
0

질문 (DIM되지 않음) 흐리게 시도에 AlertDialog 블러 배경

Dialog의 배경.

FLAG_BLUR_BEHIND이고, 이중화는이다.

접근 방식은 스크린 샷 형태로 커런트 뷰를 취하여 흐리게 처리합니다. 에 붙이고 AlertDialog이 나타나면 작동합니다.

하지만 AlertDialog는 중앙의 최고 하지 항상. 전에 (.

WindowManager.LayoutParams는 첨부 이후에 아무런 영향을 미치지 않습니다 (이미지 확인) 배경, 경고 위치에 부착 중앙에 있지만 흐림보기를 배경에 붙인 후 AlertDialog 항상 상단으로 이동)

경고 센터를 화면에 표시하려면 어떻게해야합니까? 아래

내가 노력 코드, 어떤 가이드는 내가 다시 누르면

는 경고를 표시, 이해할 수있을 것이다.

 @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. /blur/그 스크린 샷에 어떤 영향을 주는지
    2. 대화창을 사용하여 currant 창을 가져 오려면 내용이 없습니다.
    3. 스크린 샷 첨부 시간 효과
    4. 디스플레이 실제보기는 내가

    사이드 참고를 표시하고 싶었 :이 배경의 모든 유형을 첨부 할 수 있습니다! blur .. dim .. bright .. 비트 맵을 허용하는 올바른 메소드를 추가하고 BlurView 클래스에서 원하는 변경 사항으로 비트 맵을 리턴하십시오. 나는 흐림을 추가했다.

  • +0

    정확히 무엇을 원하십니까? – Piyush

    +0

    일부 스크린 샷을 추가 할 수 있습니다 ?? –

    +0

    mmm 예 경고 대화 상자를 중앙에 두는 것이 좋습니다. 하지만이 일을하려고 할 때 -> window.setBackgroundDrawable (draw); 그것은 기본적으로 화면의 상단에 간다 –

    답변

    0

    참고 :이 화면의 배경은 무엇을하는 일은 결국 문제가 alertDialog했다

    흐림 효과와 alertDialog의 배경으로 설정 그것의 스크린 샷과 흐림을, 당신은 그것을 가지고 무엇이든 할 수있다 그 흐림 배경으로 붙인 것은 항상 정상에 있었고 나는 그것을 바꿀 수 없었다.

    이 솔루션을 생각해 냈습니다.

    내가 두 alertDialogs 일 ( getWindow()의 사용에 대한) 흐림 효과입니다을 사용했고 지금 표시를하지 않습니다

    이 다른 하나는 (I는이 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