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();
Надеюсь, это поможет. Счастливого кодирования.