2013-07-19 3 views
3

Я хочу добавить границу для просмотра, ширину рамки, цвет, радиус можно задать пользователем. Поэтому я пытаюсь сделать это для этого. Когда я использую 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); 

    } 

enter image description here

ответ

1

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

mPaint.setAntiAlias(true); 
+0

Спасибо вам большое. Фактически, я добавил его в свой код. Но это недостаточно для меня. Есть ли у вас другая идея? – mmm2006

+0

mPaint.setDither (true); – Blackbelt

+0

нет эффект. :(любое другое решение? – mmm2006

0

Я хочу, чтобы этот код был вам полезен.

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); 
} 
6

Ядро проблемы - это прокладка, а не AntiAliasing. Угол не толще, скорее, это нормальная ширина. Но прямая линия обрезана.

Если вы установили ширину хода на 2, фактическая ширина прямой равна 1, так как ход прямоугольника, а ось - это линия x = 0. Это означает, что прямоугольник равен (left = 0, up = -1, right = length, bottom = 1), но up -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); 
Смежные вопросы