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();