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