Как сделать границу более гладкой

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

Спасибо большое. прилагаемый код: красный угол прямоугольника. прошлый код:

public class MPCTextView extends TextView {
    // private Context context;
    private final static String TAG = "MPCTextView";
    public final static int DEFAULT_BACKGROUND_COLOR = Color
            .parseColor("#28FF28");
    public final static int DEFAULT_BORDER_COLOR = Color.parseColor("#FF0000");

    public int mBoderWidth = 2;
    public int mBoderColor;
    public int mBoderRadius = 20;
    public int mbackgroundColor;
    public boolean isHaveBorder = true;
    public boolean isHaveBackground = true;
    RectF mRectF = new RectF();
    Rect mRec = new Rect();
    Paint mPaint = new Paint();

    public MPCTextView(Context context) {
        super(context);
        // this.context = context;
    }

    @Override
    protected void onDraw(Canvas canvas) {

        // try to add a boder for this view.
        canvas.getClipBounds(mRec);

        // draw background
        // canvas.drawColor(mbackgroundColor);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setColor(DEFAULT_BACKGROUND_COLOR);
        if (mBoderRadius > 0) {
            mRectF.set(mRec);
            canvas.drawRoundRect(mRectF, mBoderRadius, mBoderRadius, mPaint);

        } else {
            canvas.drawRect(mRec, mPaint);
        }

        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(mBoderWidth);
        mPaint.setColor(DEFAULT_BORDER_COLOR);
                mPaint.setAntiAlias(true);

        if (mBoderRadius > 0) {
            mRectF.set(mRec);
            canvas.drawRoundRect(mRectF, mBoderRadius, mBoderRadius, mPaint);

        } else {
            canvas.drawRect(mRec, mPaint);
        }

        super.onDraw(canvas);

    }

введите здесь описание изображения


person mmm2006    schedule 19.07.2013    source источник


Ответы (4)


Суть проблемы заключается в отступах, а не в сглаживании. Угол не толще, скорее, нормальной ширины. Но прямая обрезана.

Если вы установите ширину обводки на 2, реальная ширина прямой линии будет равна 1, потому что обводка прямоугольная, а ось — это линия x = 0. Это означает, что прямоугольник (слева = 0, вверх = -1, справа = длина, нижний = 1), но верхний -1 находится за пределами холста, поэтому он не будет окрашен. А угол на всю ширину, потому что он в канве.

Итак, вам просто нужно установить отступы.

Вот код, чтобы скругленный прямоугольник полностью отрисовывался внутри холста:

float pad = 1f;
mRectF.set(new RectF(mRec.left + pad, mRec.top + pad, mRec.right - pad, mRec.bottom - pad));
canvas.drawRoundRect(mRectF, mBoderRadius, mBoderRadius, mPaint);
person Snow Albert    schedule 12.11.2015

Установите сглаживание на краску, которую вы используете для рисования красного прямоугольника. Например

mPaint.setAntiAlias(true);
person Blackbelt    schedule 19.07.2013
comment
Спасибо большое. На самом деле, я добавил его в свой код. Но этого недостаточно для меня. У вас есть другая идея? - person mmm2006; 19.07.2013
comment
mPaint.setDither (истина); - person Blackbelt; 19.07.2013

Я хочу, чтобы этот код помог вам.

public int mBoderWidth = 2;
public int mBoderColor;
public int mBoderRadius = 20;
public int mbackgroundColor;
public boolean isHaveBorder = true;
public boolean isHaveBackground = true;
RectF mRectF = new RectF();
Rect mRec = new Rect();
Paint mPaint = new Paint();

public MPCTextView(Context context) {
    super(context);
    // this.context = context;
}

@Override
protected void onDraw(Canvas canvas) {

    // try to add a boder for this view.
    canvas.getClipBounds(mRec);

    // draw background
    // canvas.drawColor(mbackgroundColor);
    mPaint.setStyle(Paint.Style.FILL);
    mPaint.setColor(DEFAULT_BACKGROUND_COLOR);
    if (mBoderRadius > 0) {
        mRectF.set(mRec);
        canvas.drawRoundRect(mRectF, mBoderRadius, mBoderRadius, mPaint);

    } else {
        canvas.drawRect(mRec, mPaint);
    }

    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(mBoderWidth);
    mPaint.setColor(DEFAULT_BORDER_COLOR);
    mPaint.setAntiAlias(true);

    if (mBoderRadius > 0) {
        mRectF.set(mRec);

        ///////////// look at this code
        mRectF.left += mBorderWidth/2;
        mRectF.right -= mBorderWidth/2;
        mRectF.top += mBorderWidth/2;
        mRectF.bottom -= mBorderWidth/2;

        canvas.drawRoundRect(mRectF, mBoderRadius, mBoderRadius, mPaint);

        mRectF.left -= mBorderWidth/2;
        mRectF.right += mBorderWidth/2;
        mRectF.top -= mBorderWidth/2;
        mRectF.bottom += mBorderWidth/2;
    } else {
        canvas.drawRect(mRec, mPaint);
    }

    super.onDraw(canvas);
}
person Youngmann Kim    schedule 15.01.2014

Я знаю, что отвечаю на этот вопрос очень поздно, но это может помочь другим изменить ваш код, как показано ниже.

Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
person Umair Khalid    schedule 21.09.2018