How to add rectangles on top of existing rectangle in canvas

前端 未结 3 492
暗喜
暗喜 2020-12-04 01:45

I\'m trying to add some red rectangles within my existing canvas on top of specific boxes exactly like the expected result image but they don\'t appear at a

相关标签:
3条回答
  • 2020-12-04 02:12

    You are drawing all of the rectangles, but it looks like you want to skip all of the "odd" rectangles - or every second rectangle... and be sure to change the color to "red" - something like this:

        //draw red windows
        for (int i = 0; i < 4; i++) {
            mWindowPaint.setStyle(Paint.Style.STROKE);//add this
            int left = i * rectWidth;
            int right = left + rectWidth;
            if (i == 1){
                mWindowPaint.setStyle(Paint.Style.FILL); // change to this
            }
    
            if (i % 2 == 0) {
                Rect rect = new Rect(left, 0, right, topRectHeight);
                canvas.drawRect(rect, mRedPaint);
                Rect rect2 = new Rect(left, h - bottomRectHeight, right, h);
                canvas.drawRect(rect2, mRedPaint);
            }
        }
    }
    

    EDIT:

    I think the "filled" rectangle on the bottom is supposed to be more like:

        //draw red windows
        for (int i = 0; i < 4; i++) {
            int left = i * rectWidth;
            int right = left + rectWidth;
    
            mWindowPaint.setStyle(Paint.Style.STROKE);//add this
            if (i % 2 == 0) {
                Rect rect = new Rect(left, 0, right, topRectHeight);
                canvas.drawRect(rect, mRedPaint);
                if (i == 1){
                    mWindowPaint.setStyle(Paint.Style.FILL); // change to this
                }
                Rect rect2 = new Rect(left, h - bottomRectHeight, right, h);
                canvas.drawRect(rect2, mRedPaint);
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-04 02:22

    the problem was that you created only 4 rectangles in the screen witdh size, not in the number cell size. here is the code:

    public class RectangleTextView extends View {
        private final Paint mBlackPaint = new Paint();
        private final Paint mRedPaint = new Paint();
        private final TextPaint mTextPaint;
    
        public RectangleTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            int valueInDp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics());
            int valueInSp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics());
    
            mRedPaint.setColor(Color.parseColor("#CC3333"));
    
            mBlackPaint.setAntiAlias(false);
            mBlackPaint.setColor(Color.BLACK);
            mBlackPaint.setStrokeWidth(valueInDp);
            mBlackPaint.setStyle(Paint.Style.STROKE);
    
            mTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG);
            mTextPaint.setColor(Color.BLACK);
            mTextPaint.setTextAlign(Paint.Align.CENTER);
            mTextPaint.setTextSize(valueInSp);
    
            mWindowPaint = new Paint();
            mWindowPaint.setColor(Color.parseColor("#CC3333"));
            mWindowPaint.setStrokeWidth(valueInDp);
        }
    
        private Paint mWindowPaint;
        Rect rect = new Rect();
        Rect rect2 = new Rect();
    
        @Override protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            if (getWidth() == 0)
                return;
    
            //initialise red rectangles
            int w = canvas.getWidth();
            int h = canvas.getHeight();
    
            int rectWidth = ((w - 20) / 7) / 5;
            int space = ((w - 20) / 7) / 15;
            int topRectHeight = getPaddingTop();
            int bottomRectHeight = getPaddingBottom();
    
    
            //draw end rectangles
            int mSideRectWidth = 10;
            canvas.drawRect(0, 0, mSideRectWidth, getHeight(), mRedPaint); //draw left end rectangle
            canvas.drawRect(getWidth() - mSideRectWidth, 0, getWidth(), getHeight(), mRedPaint); //draw right end rectangle
    
            //draw grey boxes
            setBackgroundColor(Color.parseColor("#808080"));
            int boxWidth = (getWidth() - mSideRectWidth) / 7;
    
            //draw text views
            for (int i = 0; i < 7; i++) {
                canvas.drawText(Integer.toString(i + 1), (i * boxWidth + 10) + (boxWidth / 2), ((canvas.getHeight() / 2) - ((mTextPaint.descent() + mTextPaint.ascent()) / 2)), mTextPaint);
            }
    
            //draw black lines
            for (int i = 1; i < 7; i++) {
                canvas.drawLine(mSideRectWidth + boxWidth * i, 0, mSideRectWidth + boxWidth * i, getHeight(), mBlackPaint);
            }
    
            //draw red windows
            for (int index = 0; index < 7; index++) {
    
                if (index == 0 || index == 6) {
                    for (int i = 0; i < 3; i++) {
                        mWindowPaint.setStyle(Paint.Style.STROKE);//add this
    
                        int left = (i * (rectWidth + space)) + (index * boxWidth) + 13 + rectWidth/2 + space/2;
                        int right = left + rectWidth;
    
                        rect.set(left, 0, right, topRectHeight);
                        canvas.drawRect(rect, mWindowPaint);
    
                        if (index == 0 && i == 1) {
                            mWindowPaint.setStyle(Paint.Style.FILL); // change to this
                        }
                        rect2.set(left, h - bottomRectHeight, right, h);
                        canvas.drawRect(rect2, mWindowPaint);
    
                    }
    
                } else {
                    for (int i = 0; i < 4; i++) {
                        mWindowPaint.setStyle(Paint.Style.STROKE);//add this
                        int left = (i * (rectWidth + space)) + (index * boxWidth) + 13;
                        int right = left + rectWidth;
    
                        rect.set(left, 0, right, topRectHeight);
    
                        canvas.drawRect(rect, mWindowPaint);
    
                        rect2.set(left, h - bottomRectHeight, right, h);
                        canvas.drawRect(rect2, mWindowPaint);
                    }
                }
            }
        }
    }
    

    this is the full code perfectly working for me. if you have any question or doubt feel free to post it :)

    this is how i see them:

    0 讨论(0)
  • 2020-12-04 02:27

    Try this:

    public class RectangleTextView extends View {
        private final Paint mBlackPaint = new Paint();
        private final Paint mRedPaint = new Paint();
        private final TextPaint mTextPaint;
    
        public RectangleTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            int valueInDp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics());
            int valueInSp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics());
    
            mRedPaint.setColor(Color.parseColor("#CC3333"));
    
            mBlackPaint.setAntiAlias(false);
            mBlackPaint.setColor(Color.BLACK);
            mBlackPaint.setStrokeWidth(valueInDp);
            mBlackPaint.setStyle(Paint.Style.STROKE);
    
            mTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG);
            mTextPaint.setColor(Color.BLACK);
            mTextPaint.setTextAlign(Paint.Align.CENTER);
            mTextPaint.setTextSize(valueInSp);
    
            mWindowPaint = new Paint();
            mWindowPaint.setColor(Color.parseColor("#CC3333"));
            mWindowPaint.setStrokeWidth(valueInDp);
        }
    
        private Paint mWindowPaint;
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            if (getWidth() == 0)
                return;
    
            //initialise red rectangles
            int h = canvas.getHeight();
    
    
            int topRectHeight = getPaddingTop();
            int bottomRectHeight = getPaddingBottom();
    
    
            //draw end rectangles
            int mSideRectWidth = 10;
            canvas.drawRect(0, 0, mSideRectWidth, getHeight(), mRedPaint); //draw left end rectangle
            canvas.drawRect(getWidth() - mSideRectWidth, 0, getWidth(), getHeight(), mRedPaint); //draw right end rectangle
    
            //draw grey boxes
            setBackgroundColor(Color.parseColor("#808080"));
            int boxWidth = (getWidth() - mSideRectWidth) / 7;
    
    
            int redRectWidth = boxWidth / 5;
            int redRectSpace = redRectWidth / 3;
    
            //draw text views
            for (int i = 0; i < 7; i++) {
                canvas.drawText(Integer.toString(i + 1), (i * boxWidth + 10) + (boxWidth / 2), ((canvas.getHeight() / 2) - ((mTextPaint.descent() + mTextPaint.ascent()) / 2)), mTextPaint);
    
                int baseStartX = i * boxWidth;
    
                //draw red windows
                for (int j = 0; j < 4; j++) {
                    mWindowPaint.setStyle(Paint.Style.STROKE);//add this
                    int left = mSideRectWidth + baseStartX + (j * (redRectWidth + redRectSpace));
                    int right = left + redRectWidth;
                    if (j == 1) {
                        mWindowPaint.setStyle(Paint.Style.FILL); // change to this
                    }
    
                    Rect rect = new Rect(left, 0, right, topRectHeight);
                    canvas.drawRect(rect, mWindowPaint);
                    Rect rect2 = new Rect(left, h - bottomRectHeight, right, h);
                    canvas.drawRect(rect2, mWindowPaint);
                }
            }
    
            //draw black lines
            for (int i = 1; i < 7; i++) {
    
                int startX = mSideRectWidth + boxWidth * i;
                int startY = 0;
                int stopX = mSideRectWidth + boxWidth * i;
                int stopY = getHeight();
                canvas.drawLine(startX, startY, stopX, stopY, mBlackPaint);
    
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题