挖掘Android布局中的漏洞

是否可以在Android布局中创建孔。我有两个背景,一个是普通的,一个是模糊的,以及我想要创建可以显示模糊背景的单元格。

我的XML将构造如下:

Background_blurred> Background_normal> Cells。

– 我已经知道如何模糊背景。

-Cells无处不在,如GridView,而不仅仅是边界。 在此处输入图像描述

试试这个:

class FL extends FrameLayout { private List mViews = new ArrayList(); private Bitmap mBack; private Bitmap mBackBlur; private int[] mLocation = new int[2]; private Matrix mMatrix = new Matrix(); public FL(Context context) { super(context); Resources res = getResources(); mBack = BitmapFactory.decodeResource(res, R.drawable.back); mBackBlur = BitmapFactory.decodeResource(res, R.drawable.back_blur); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { RectF src = new RectF(0, 0, mBack.getWidth(), mBack.getHeight()); RectF dst = new RectF(0, 0, w, h); mMatrix.setRectToRect(src, dst, ScaleToFit.FILL); } public void add(View v) { mViews.add(v); } @Override protected void dispatchDraw(Canvas canvas) { canvas.drawBitmap(mBack, mMatrix, null); canvas.save(Canvas.CLIP_SAVE_FLAG); getLocationOnScreen(mLocation); int x = mLocation[0]; int y = mLocation[1]; Op op = Op.REPLACE; for (View v : mViews) { v.getLocationOnScreen(mLocation); mLocation[0] -= x; mLocation[1] -= y; int left = mLocation[0]; int top = mLocation[1]; int right = left + v.getWidth(); int bottom = top + v.getHeight(); canvas.clipRect(left, top, right, bottom, op); op = Op.UNION; } canvas.drawBitmap(mBackBlur, mMatrix, null); canvas.restore(); super.dispatchDraw(canvas); } } 

测试代码(在onCreate中):

  FL fl = new FL(this); ScrollView sv = new ScrollView(this); LinearLayout ll = new LinearLayout(this); ll.setOrientation(LinearLayout.VERTICAL); float[] hsv = { 0, 1, 0.75f }; float[] h = { 0, 39, 60, 120, 300 }; for (int i = 0; i < 5; i++) { TextView tv = new TextView(this); hsv[0] = h[i]; tv.setTextColor(0xffeeeeee); tv.setBackgroundColor(Color.HSVToColor(128, hsv)); tv.setPadding(10, 10, 10, 10); tv.setTextSize(64); tv.setText("#" + i); LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); params.topMargin = 10; params.bottomMargin = 10; params.leftMargin = 20; params.rightMargin = 20; ll.addView(tv, params); fl.add(tv); } sv.addView(ll); fl.addView(sv); setContentView(fl); 

其中R.drawable.back是:

在此处输入图像描述

和R.drawable.back_blur是:

在此处输入图像描述

结果是:

在此处输入图像描述