最近在看View 的重寫,發現很多地方用到了Paint,且自己對這方面欠缺,故作筆記,便於自己不用重複去網上查資料.
畫 圓,圓弧,字體,矩形
圓弧就是圓的一小部分,圓有外接正方形,圓弧同樣也有外接,矩形所以說如果畫圓弧,先畫一個矩形,在矩形中內接一段圓弧
public void drawArc(RectF oval, float startAngle, float weepAngle, boolean useCenter, Paint paint)
- oval :指定圓弧的外輪廓矩形區域。
- startAngle: 圓弧起始角度,單位爲度。座標軸,X軸正反向爲0°,所以說一般是從270°開始
- sweepAngle: 圓弧掃過的角度,順時針方向,單位爲度,從右中間開始爲零度。
- useCenter: 如果爲True時,弧的個邊界,和圓心連接,爲扇形,通常用來繪製扇形。
true![這裏寫圖片描述]()
false![這裏寫圖片描述]()
- paint: 繪製圓弧的畫板屬性,如顏色,是否填充等。
Paint paint = new Paint();
paint.setStrokeWidth(20);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLUE);
mArcPaint.setStrokeWidth((float) (length * 0.1));
設置所用的線寬
先看下效果
代碼,是一個自定義的View
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
public class CircleProgressView extends View {
private int mMeasureHeigth;
private int mMeasureWidth;
//圓
private Paint mCirclePaint;
private float mCircleXY;
private float mRadius;
//弧
private Paint mArcPaint;
private RectF mArcRectF;
private float mSweepAngle;
private float mSweepValue = 66;
//字
private Paint mTextPaint;
private String mShowText;
private float mShowTextSize;
public CircleProgressView(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public CircleProgressView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CircleProgressView(Context context) {
super(context);
}
@Override
protected void onMeasure(int widthMeasureSpec,
int heightMeasureSpec) {
mMeasureWidth = MeasureSpec.getSize(widthMeasureSpec);
mMeasureHeigth = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(mMeasureWidth, mMeasureHeigth);
initView();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 繪製圓
canvas.drawCircle(mCircleXY, mCircleXY, mRadius, mCirclePaint);
// 繪製弧線 座標軸,X軸正反向爲0°,所以說一般是從270°開始
canvas.drawArc(mArcRectF, 270, mSweepAngle, false, mArcPaint);
// 繪製文字
canvas.drawText(mShowText, 0, mShowText.length(),
mCircleXY, mCircleXY + (mShowTextSize / 4), mTextPaint);
}
private void initView() {
float length = 0;
if (mMeasureHeigth >= mMeasureWidth) {
length = mMeasureWidth;
} else {
length = mMeasureHeigth;
}
//圓的位置,
mCircleXY = length / 2;
//圓的半徑
mRadius = (float) (length * 0.5 / 2);
//圓的畫筆
mCirclePaint = new Paint();
mCirclePaint.setAntiAlias(true);
mCirclePaint.setColor(getResources().getColor(
android.R.color.holo_blue_bright));
mArcRectF = new RectF(
(float) (length * 0.1),
(float) (length * 0.1),
(float) (length * 0.9),
(float) (length * 0.9));
//將一圈360°分爲,100份
mSweepAngle = (mSweepValue / 100f) * 360f;
mArcPaint = new Paint();
mArcPaint.setAntiAlias(true);
mArcPaint.setColor(getResources().getColor(
android.R.color.holo_blue_bright));
//設置所用的線寬
mArcPaint.setStrokeWidth((float) (length * 0.1));
mArcPaint.setStyle(Style.STROKE);
mShowText = setShowText();
mShowTextSize = setShowTextSize();
mTextPaint = new Paint();
mTextPaint.setTextSize(mShowTextSize);
mTextPaint.setTextAlign(Paint.Align.CENTER);
}
private float setShowTextSize() {
this.invalidate();
return 50;
}
private String setShowText() {
this.invalidate();
return "馬世豪";
}
public void forceInvalidate() {
this.invalidate();
}
public void setSweepValue(float sweepValue) {
if (sweepValue != 0) {
mSweepValue = sweepValue;
} else {
mSweepValue = 25;
}
this.invalidate();
}
}