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);
    }

 

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