Как установить часть изображения размытой андроид - PullRequest
0 голосов
/ 23 октября 2019

У меня есть представление, в заголовке у меня есть текстовое представление, я не хочу назначать некоторый цвет фона для этого представления, но размытый фон. Я не могу найти какой-либо способ добиться этого, Это невозможно в Android.

Я смог размыть текстовый просмотр текста, но не его фон с помощью следующего кода.

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

Я хочу добиться чего-то подобного, но не хочу использовать цвет фона для просмотра текста.

-f

1 Ответ

0 голосов
/ 24 октября 2019

Renderscript - очень мощный и оптимизированный «движок» для работы с графикой. Я использовал это пару недель назад. ты можешь попробовать. Я вызвал applyBlur() метод, чтобы сделать простой макет размытым , вы можете просто добавить TextView внутри тела макета и сделать макет размытым. Проверьте следующие фрагменты кода:

Метод 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();

Надеюсь, это поможет. Счастливого кодирования.

...