在項目中,我在做,我遇到了問題。我必須創建一個視圖,基於XML,CSS和資產,並清單,描述關係。如果容器中的所有視圖在模擬視圖中模糊化(如果容器以編程方式創建的話)?
我使用Compositor模式來解析xml,並創建Views層次結構。問題是在很少的意見中。他們可能有一個參數「模糊」與布爾值,它可以是這樣的:
RelativeLayout - container
|---ImageView - view in container with background image
|---RelativeLayout - less than container, bluring view
我用great article並創建兩個方法
public static void applyBlur(final View parent, final View blurring) {
parent.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
parent.getViewTreeObserver().removeOnPreDrawListener(this);
parent.buildDrawingCache();
Bitmap bmp = parent.getDrawingCache();
blur(bmp, blurring);
return true;
}
});
}
和
private static void blur(Bitmap bkg, View view) {
float radius = 10;
Bitmap overlay = Bitmap.createBitmap(view.getLayoutParams().width, view.getLayoutParams().height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(overlay);
canvas.translate(-view.getLeft(), -view.getTop());
canvas.drawBitmap(bkg, 0, 0, null);
RenderScript rs = RenderScript.create(view.getContext());
Allocation overlayAlloc = Allocation.createFromBitmap(
rs, overlay);
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(
rs, overlayAlloc.getElement());
blur.setInput(overlayAlloc);
blur.setRadius(radius);
blur.forEach(overlayAlloc);
overlayAlloc.copyTo(overlay);
view.setBackground(new BitmapDrawable(view.getContext().getResources(), overlay));
rs.destroy();
}
它可以完美地與在xml中創建的佈局 - 模糊視圖下層次結構中的所有視圖都模糊不清。但是,如果我以編程方式創建視圖層次結構,則可以僅模糊父視圖,也不會使模糊視圖處於同一層次的視圖。看起來像父視圖「不知道」其他視圖。
例如,當我從描述的層次結構中刪除圖像視圖並將其圖像設置爲父級背景時 - 我得到結果。但這不是解決方案,因爲層次結構比我描述的更深,我必須模糊所有意見模糊的觀點。我如何向容器「解釋」它包含它包含的所有視圖?這一定是可能的,因爲我看到它是如何工作的時候,在應用資源XML中創建佈局。容器「知道」其中的所有視圖,並且在這種情況下它們都完美模糊。
阿爾法是透明度。這是好的,但不是我需要的效果。我需要http://imgur.com/a/9rGLL。如果它創建了programmaticaly(你可以在圖片中看到結果)以及在佈局中的所有視圖(如果它們是在resourse中創建的),但是如果我以編程方式使它們在佈局中的所有視圖都無法實現,那麼我將它設置爲父視圖。 – iamthevoid