使用canvas.drawRoundRect()時,解決四個圓角的線比較粗的問題,最近在使用 drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint) 畫圓角矩形時,四個圓角的線總是比四條邊的線更粗,看起來相當難看。
如下圖:
畫圖的代碼片段如下。protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int width = getWidth();
int height = getHeight();
mPaint.setColor(Color.BLUE);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
canvas.drawRoundRect(0, 0, width, height, 20, 20, mPaint);
}
為啥會這樣呢。試圖檢視源碼,發現該方法的實作是利用JNI調用的本地方法。隻能自己悶頭調試,終于。。。
其實,不是圓角的線粗了,而是四條邊的線變細了。what ?
圓角矩形應該是基于矩形繪制的,當 mPaint.setStrokeWidth(5) 設定線寬為5,那麼矩形的左上角的外邊是從 (-2.5,-2.5)開始,内角是從(2.5,2.5)開始,加起來線寬是5。
但是畫布Canvas是從(0,0)開始顯示的,是以四條邊的外面一半就被截掉顯示不了了。如下圖。是以其實一般情況下,我們畫出來的矩形的線寬隻有我們 setStrokeWidth設定的一半寬。
當形狀是圓角矩形時,四個角縮進去了,是以圓角上的弧線沒有被截掉一半,是我們setStrokeWidth 時的真正線寬。導緻圓角上的線看起來特别粗。
找到原因,就easy了,在繪制圓角矩形時,往裡縮一點,不要讓四條邊被截掉一半就可以了。
代碼如下,繪制時,調整下點的參數
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int width = getWidth();
int height = getHeight();
mPaint.setColor(Color.BLUE);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
canvas.drawRoundRect(2.5f, 2.5f, width-2.5f, height-2.5f, 20, 20, mPaint);
}
這樣顯示出來的圓角矩形看起來就舒服多了。
over,over!!!