

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

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

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

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

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

[![左上がcanvas、右下がカスタムView内で別途用意したcanvasへの描画](https://i.stack.imgur.com/m9V0H.jpg)](https://i.stack.imgur.com/m9V0H.jpg)

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

[code]

    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);
        }
    }
    
[/code]


CC BY-SA 3.0
2016-02-18T04:31:37.950
22223
2016-02-18T04:31:37.950
9498
question
android
Canvas.drawRectの座標指定について