2016-07-08 3 views
1

Я хочу рисовать на холсте скругленный прямоугольник заполнить цветом (или растрового изображения) и с инсультом, но без некоторых выбранных углов, а также без границы на некоторых отдельных сторон. любые идеи, как я могу это достичь?Как нарисовать частичный круглый прямоугольник на андроидном холсте?

ответ

1

Вы можете разделить процесс рисования на две части.

  1. начертить область заливки

    при попытке нарисовать фигуру, которая не поддерживает с помощью стандартных интерфейсов API SDK, метод Canvas.drawPath будет хороший способ сделать it.you можно просто определить четыре переменные для представления радиусов четырех углов.

    Path path = new Path(); 
    Rect drawingRect = {the rect area you want to draw} 
    RectF topLeftArcBound = new RectF(); 
    RectF topRightArcBound = new RectF(); 
    RectF bottomLeftArcBound = new RectF(); 
    RectF bottomRightArcBound = new RectF(); 
    
    topRightArcBound.set(drawingRect.right - topRightRadius * 2, drawingRect.top, drawingRect.right, drawingRect.top + topRightRadius * 2); 
    bottomRightArcBound.set(drawingRect.right - bottomRightRadius * 2, drawingRect.bottom - bottomRightRadius * 2, drawingRect.right, drawingRect.bottom); 
    bottomLeftArcBound.set(drawingRect.left, drawingRect.bottom - bottomLeftRadius * 2, drawingRect.left + bottomLeftRadius * 2, drawingRect.bottom); 
    topLeftArcBound.set(drawingRect.left, drawingRect.top, drawingRect.left + bottomLeftRadius * 2, drawingRect.top + bottomLeftRadius * 2); 
    
    path.reset(); 
    
    path.moveTo(drawingRect.left + topLeftRadius, drawingRect.top); 
    
    //draw top horizontal line 
    path.lineTo(drawingRect.right - topRightRadius, drawingRect.top); 
    
    //draw top-right corner 
    path.arcTo(topRightArcBound, -90, 90); 
    
    //draw right vertical line 
    path.lineTo(drawingRect.right, drawingRect.bottom - bottomRightRadius); 
    
    //draw bottom-right corner 
    path.arcTo(bottomRightArcBound, 0, 90); 
    
    //draw bottom horizontal line 
    path.lineTo(drawingRect.left - bottomLeftRadius, drawingRect.bottom); 
    
    //draw bottom-left corner 
    path.arcTo(bottomLeftArcBound, 90, 90); 
    
    //draw left vertical line 
    path.lineTo(drawingRect.left, drawingRect.top + topLeftRadius); 
    
    //draw top-left corner 
    path.arcTo(topLeftArcBound, 180, 90); 
    
    path.close(); 
    
    paint.setStyle(Paint.Style.FILL); 
    canvas.drawPath(path, paint); 
    

    и вы можете просто установить радиус до нуля для выбранных углов

  2. ничья граница

    граница состоит из восьми частей:

    • верхний левый угол
    • верх line
    • верхний правый угол
    • правая линия
    • нижний правый угол
    • нижняя линия
    • нижний левый угол
    • левая линия

    использовать значение INT, чтобы содержит выбранные части будут хорошая идея

     
    private static final int TOP_LEFT_CORNER = 0x1; 
    private static final int TOP_LINE = 0x2; 
    private static final int TOP_RIGHT_CORNER = 0x4; 
    private static final int RIGHT_LINE = 0x8; 
    private static final int BOTTOM_RIGHT_CORNER = 0x10; 
    private static final int BOTTOM_LINE = 0x20; 
    private static final int BOTTOM_LEFT_CORNER = 0x40; 
    private static final int LEFT_LINE = 0x80; 
    
    private int selectedParts = TOP_LEFT_CORNER | TOP_LINE | TOP_RIGHT_CORNER; 
    

    и теперь мы можем сделать граница на основе отдельных частей:

     
    paint.setStyle(Paint.Style.STROKE); 
    if((selectedParts & TOP_LINE) > 0){ 
        canvas.drawLine(drawingRect.left + topLeftRadius, drawingRect.top, drawingRect.right - topRightRadius, drawingRect.top); 
    } 
    
    if((selectedParts & TOP_RIGHT_CORNER) > 0){ 
        canvas.drawArc(topRightArcBound, -90, 90, false, paint); 
    } 
    
    if((selectedParts & RIGHT_LINE) > 0){ 
        canvas.drawLine(drawingRect.right, drawingRect.top + topRightRadius, drawingRect.right, drawingRect.bottom - bottomRightRadius, paint); 
    } 
    
    if((selectedParts & BOTTOM_RIGHT_CORNER) > 0){ 
        canvas.drawArc(bottomRightArcBound, 0, 90, false, paint); 
    } 
    
    if((selectedParts & BOTTOM_LINE) > 0){ 
        canvas.drawLine(drawingRect.right - bottomRightRadius, drawingRect.bottom. drawingRect.left + bottomLeftRadius, drawingRect.bottom, paint); 
    } 
    
    if((selectedParts & BOTTOM_LEFT_CORNER) > 0){ 
        canvas.drawArc(bottomLeftArcBound, 90, 90, false, paint); 
    } 
    
    if((selectedParts & LEFT_LINE) > 0){ 
        canvas.drawLine(drawingRect.left, drawingRect.bottom - bottomLeftRadius, drawingRect.left, drawingRect.top + topLeftRadius, paint); 
    } 
    
    if((selectedParts & TOP_LEFT_CORNER) > 0){ 
        canvas.drawArc(topLeftArcBound, 180, 90, false, paint); 
    }