背景:
如果给父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);
}