2013-07-19 3 views
3

테두리, 테두리 너비, 색상, 반지름을 사용자가 설정할 수 있습니다. 그래서 저는 그것을 위해 직사각형을 그려 봅니다. drawRoundRect를 사용하여 그리면 구석의 선이 부드럽 지 않고 다른 부분보다 두껍습니다. 나는 그것을 고치는 법을 모른다. 제발 좀 가르쳐주세요. 그것을 할 다른 방법이 있습니까? 그것을 그리려면 코드를 사용해야합니다.테두리를 더 부드럽게 만드는 방법

대단히 감사합니다. 첨부 코드 : rect의 빨간색 모서리. 과거 코드 :

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

감사합니다 당신이 아주 많이 : 여기

은 둥근 RECT 캔버스 내부에 완전히 그릴 만들 수있는 코드입니다. 사실, 나는 그것을 코드에 추가했다. 그러나 그것은 나를 위해 충분하지 않습니다. 다른 아이디어있어? – 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

문제의 핵심은 안티 앨리어싱이 아니라 패딩입니다. 모퉁이는 두꺼운 것이 아니라 오히려 일반적인 너비입니다. 그러나 직선은 잘립니다.

스트로크 너비를 2로 설정하면 스트로크가 직사각형이고 축이 x = 0 라인이기 때문에 실제 직선 너비가 1입니다. 이것은 (왼쪽 = 0, 위쪽 = -1, right = length, bottom = 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);