Android setClipToChild 冲突问题

背景:

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章