设计图是这样的
下面的卡片需要占上面的背景的一半
以前都是把下面卡片的大小写死,然后设置一个负的marginTop
但是现在想这么写的时候,突然感觉有点low,所以就换了一种写法
layoutTop是上面的根布局
layoutMoney是下面卡片的根布局
mBackground是背景图片
/** * 设置背景高度 */ private void refreshBackground() { //SDK大于16 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { layoutTop.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (layoutTop != null) { final int heightEv = layoutTop.getMeasuredHeight(); layoutMoney.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (layoutMoney != null) { int heightHeader = layoutMoney.getMeasuredHeight(); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT, (int) //卡片设置了marginTop 20dp,所以要加上这个marginTop的距离 (heightEv + DeviceUtils.dip2px(getContext(), 20) + (heightHeader + 0f) / 2)); mBackground.setLayoutParams(params); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { if (layoutMoney != null) { layoutMoney.getViewTreeObserver().removeOnGlobalLayoutListener(this); } } } }); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { layoutTop.getViewTreeObserver().removeOnGlobalLayoutListener(this); } } } }); } else { //SKD小于16的时候头布局背景为包裹内容 RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); mBackground.setLayoutParams(params); } }最后在onResume()中调用就好了