Android中Paint畫圖

最近在看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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章