【问题标题】:How to set part of image blurry android如何设置部分图像模糊android
【发布时间】:2019-10-23 20:12:05
【问题描述】:

我有一个视图,在标题我有一个文本视图,我不想为这个视图分配一些背景颜色,而是模糊背景。我无法找到任何方法来实现这一点,在 android 中是不可能的。

通过使用以下代码,我能够模糊 textview 文本,但不能模糊其背景。

 float radius = tv.getTextSize()/10;
    BlurMaskFilter filter = new BlurMaskFilter(radius,style);
    tv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    tv.getPaint().setMaskFilter(filter);

我想实现这样的目标,但不想为 textview 使用背景色。

【问题讨论】:

    标签: android android-layout android-fragments


    【解决方案1】:

    Renderscript 是一个非常强大且经过优化的“引擎”,可用于处理图形。几周前我用过它。你可以试试。我调用了applyBlur() 方法来制作一个简单的布局blurry,你可以在布局的主体内添加TextView 并将布局渲染为模糊。检查下面的代码sn-ps:

    方法applyBlur():

       private void applyBlur() {
        image.getViewTreeObserver().addOnPreDrawListener(new 
          ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                image.getViewTreeObserver().removeOnPreDrawListener(this);
                image.buildDrawingCache();
    
                Bitmap bmp = image.getDrawingCache();
                blur(bmp, text);
                return true;
            }
        });
    }
    

    所以,在blur() 方法中:

    • 首先我创建了一个空位图来复制我的部分背景。
    • 这个位图我稍后会模糊并设置为我的 TextView 的背景
    • 创建由该位图备份的画布
    • 将画布翻译到我的 TextView 在父布局中的位置
    • 将我的 ImageView 的一部分绘制到位图
    • 此时,我的位图与我的 TextView 大小相等,并且包含我的 ImageView 中位于 TextView 后面的那部分
    private void blur(Bitmap bkg, View view) {
        long startMs = System.currentTimeMillis();
    
        float radius = 20;
    
        Bitmap overlay = Bitmap.createBitmap((int) (view.getMeasuredWidth()),
                (int) (view.getMeasuredHeight()), 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(getActivity());
    
        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(
                getResources(), overlay));
    
        rs.destroy();
        statusText.setText(System.currentTimeMillis() - startMs + "ms");
    }
    

    不要忘记将“RenderScript”添加到toString()

    @Override
    public String toString() {
        return "RenderScript";
    }
    

    最后,

    private TextView addStatusText(ViewGroup container) {
        TextView result = new TextView(getActivity());
        result.setLayoutParams(new 
        ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT));
        result.setTextColor(0xFFFFFFFF);
        container.addView(result);
        return result;
    }
    

    然后在我的 onCreate()onCreateView() 方法中,我只是这样称呼它:

    TextView statusText = addStatusText((ViewGroup) view.findViewById(R.id.controls));
    applyBlur();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多