2013-07-19 55 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);