2011-07-22 93 views
66

我想要使背景不僅透明,而且還會產生模糊效果。這樣下面的觀點似乎沒有重點。按住電源按鈕後,我希望它看起來像屏幕一樣。有任何想法嗎?創建模糊的透明背景效果

回答

118

現在窗口標誌已被棄用,您必須模糊自己。我在其他地方回答了這個問題,但這裏是您如何模糊視圖:

您現在可以使用RenderScript庫中的ScriptIntrinsicBlur快速模糊。 Here是如何訪問RenderScript API。以下是我做了模糊視圖和位圖類:

import android.support.v8.renderscript.*; 

public class BlurBuilder { 
    private static final float BITMAP_SCALE = 0.4f; 
    private static final float BLUR_RADIUS = 7.5f; 

    public static Bitmap blur(View v) { 
     return blur(v.getContext(), getScreenshot(v)); 
    } 

    public static Bitmap blur(Context ctx, Bitmap image) { 
     int width = Math.round(image.getWidth() * BITMAP_SCALE); 
     int height = Math.round(image.getHeight() * BITMAP_SCALE); 

     Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false); 
     Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap); 

     RenderScript rs = RenderScript.create(ctx); 
     ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); 
     Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap); 
     Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap); 
     theIntrinsic.setRadius(BLUR_RADIUS); 
     theIntrinsic.setInput(tmpIn); 
     theIntrinsic.forEach(tmpOut); 
     tmpOut.copyTo(outputBitmap); 

     return outputBitmap; 
    } 

    private static Bitmap getScreenshot(View v) { 
     Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); 
     Canvas c = new Canvas(b); 
     v.draw(c); 
     return b; 
    } 
} 

要申請這一個片段,添加以下onCreateView

final Activity activity = getActivity(); 
final View content = activity.findViewById(android.R.id.content).getRootView(); 
if (content.getWidth() > 0) { 
    Bitmap image = BlurBuilder.blur(content); 
    window.setBackgroundDrawable(new BitmapDrawable(activity.getResources(), image)); 
} else { 
    content.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      Bitmap image = BlurBuilder.blur(content); 
      window.setBackgroundDrawable(new BitmapDrawable(activity.getResources(), image)); 
     } 
    }); 
} 

注:這種解決方案需要最小的SDK是API 17

編輯:的renderScript被納入支持V8使這個回答道N到API 8.要啓用它使用的gradle 包括這些行到您的gradle這個文件(從這個answer),並從包android.support.v8.renderscript使用的renderScript:

android { 
    ... 
    defaultConfig { 
    ... 
    renderscriptTargetApi *your target api* 
    renderscriptSupportModeEnabled true 
    } 
    ... 
} 
+1

你搖滾。這嚴重幫助了我。我添加的一件事是從模糊函數返回的位圖是一個TransitionDrawable。這有助於使模糊效果更加平滑。 –

+0

這很好。謝謝! –

+1

注意BITMAP_SCALE和BLUR_RADIUS常量是如何工作的?謝謝 –

15

如果你想要做的是模糊的activty背後的窗口的背景,那麼你可以使用這個調用從你的活動中(或任何一類,像一個AlertDialog,有一個窗口)

getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND); 

更新:此標誌在Android 4.0中已棄用,不再適用

+0

正是我在找的東西。我很感激! –

+3

已棄用,此設備不再適用於Android L. –

+1

已棄用,編輯您的答案 –

0

模糊是一個很好的

:將它添加到項目,當你想模糊包你想在一個FrameLayout裏模糊,然後使用該行的觀點後 https://github.com/wasabeef/Blurry

:選項,它會很容易地給你的影響正在尋找10

Blurry.with(this).radius(25).sampling(2).onto((ViewGroup) findViewById(R.id.viewToBlurWrapper));