背景:
如果給父View 設置setClipToChild(false) ,那麼如果父View中存在寬度爲父View一半的
子View(RecyclerView 或者ScrollView),這個時候將導致RecyclerView或者ScrollView展示的View 超出RecyclerView或者ScrollView的可視區域。
原因:
硬件加速導致子View的RenderNode.setClipToChild被設置爲false,這個時候,如果無論在父View之前還是之後,RecyclerView或者ScrollView設置setClipToChild(true) 將是無效的。
解決方法:
[1]關閉硬件加速,這種沒有試過。
[2] 複寫RecyclerView 或者ScrollView的dispatchDraw方法,可行。
private Path clipPath;
private RectF clipRect;
private PaintFlagsDrawFilter mPaintFlagsDrawFilter;
private void initPainter() {
mPaintFlagsDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG);
}
@Override
protected void dispatchDraw(Canvas canvas) {
int height = getHeight();
int width = getWidth();
DrawFilter drawFilter = canvas.getDrawFilter();
int saveCount = canvas.save();
canvas.setDrawFilter(mPaintFlagsDrawFilter);
if (clipPath == null || clipRect == null) {
clipPath = new Path();
clipRect = new RectF(0, 0, width, height);
}
clipRect.right = width;
clipRect.bottom = height;
clipPath.reset();
clipPath.addRect(clipRect, Path.Direction.CCW);
canvas.clipPath(clipPath);
super.dispatchDraw(canvas);
canvas.restoreToCount(saveCount);
canvas.setDrawFilter(drawFilter);
}