Viewを継承したカスタムViewで矩形を描画しました。

onDrawに渡されるcanvasを使った描画と、カスタムView内で別途用意したCanvasへの描画で違いが生じました。

onDrawに渡されるcanvasへの描画で矩形が表示されないのは、指定した座標のleftやtopが、rightやbottomより大きいせい(左から順番に座標を指定していないせい)だというのは分かります。

一方で、同じように左から順番に指定していないにもかかわらず、カスタムView内で用意したCanvasへのdrawRectでは描画できてしまっています。

この違いはなぜ生じるのでしょうか?

左上がcanvas、右下がカスタムView内で別途用意したcanvasへの描画

以下のコードで描画しています。

public class DrawRectView extends View{
    private Paint paint;
    private Bitmap cacheBitmap;
    private Canvas cacheCanvas;

    public DrawRectView(Context context) {
        this(context, null);
    }

    public DrawRectView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public DrawRectView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public DrawRectView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    private void init(){
        paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setAntiAlias(true);
        paint.setStrokeWidth(5);
        paint.setStyle(Paint.Style.STROKE);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        cacheBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        cacheCanvas = new Canvas(cacheBitmap);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // 描画される
        canvas.drawRect(100, 100, 200, 200, paint);
        // 描画されない→矩形の左から座標をしていないため?
        canvas.drawRect(100, 100, 50, 50, paint);
        // 描画される
        cacheCanvas.drawRect(300, 300, 400, 400, paint);
        // 描画される→なぜ?
        cacheCanvas.drawRect(300, 300, 250, 250, paint);
        canvas.drawBitmap(cacheBitmap, 0, 0, paint);
    }
}