在我正在做的项目中,我遇到了问题。我必须创建一个基于xml、css和资产的视图,以及描述关系的清单。
我使用组合器模式解析xml,并创建视图层次结构。问题在于层次结构中的几个视图。它们可能有一个布尔值的参数blur,它看起来像:
RelativeLayout - container
|---ImageView - view in container with background image
|---RelativeLayout - less than container, bluring view
我用伟大的文章和创建两个方法
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布局时的工作原理。
@iamthevoid对于视图,我们有一个名为Alpha的属性。尝试将属性设置为imageview或relativelayout。
已解析。问题是在使用通用图像加载程序库。它在imageView中异步加载图像,模糊"截图"下的子相对布局在imageView中显示的图像之前。它产生的图像不模糊。我将ui从逻辑中排除,并在uthread的ImageView中加载图像,以确保在图像加载后强烈模糊。而且确实有效。))由于