簡單的鐘表自定義控件

簡單的鐘表自定義控件

效果圖:一個簡短的會旋轉的針盤
代碼如下:`/**

  • Created by LCT

  • Time:2019/6/11 10:36.

  • Annotation:
    /
    public class MyClockView extends View {
    Context context;
    float strokeWidth = 26;
    /
    *

    • 時針寬度
      /
      float hourHandsStrokeWidth = strokeWidth / 3;
      /
      *
    • 分針寬度
      /
      float minuteHandStrokeWidth = hourHandsStrokeWidth / 2;
      /
      *
    • 時針長度
      /
      float hourHandsL = strokeWidth * 5;
      /
      *
    • 分針長度
      /
      float minuteHandL = strokeWidth * 4;
      int width;
      int height;
      /
      *
    • 圓環色
      /
      String c1 = “#2b374a”;
      /
      *
    • 粉紅弧線
      /
      String c2 = “#a34c33”;
      String c22 = “#d27953”;
      /
      *
    • 藍色弧線
      /
      String c3 = “#3F51B5”;
      /
      *
    • 指針
      /
      String c4 = “#9a9a98”;
      Paint paintC = new Paint();
      /
      *
    • 還未開始畫筆
      /
      Paint paintA = new Paint();
      Paint paintB = new Paint();
      Paint paintD = new Paint();
      /
      *
    • 時針畫筆
      /
      Paint timeNeedlePaint = new Paint();
      /
      *
    • 分針畫筆
      */
      Paint minuteNeedlePaint = new Paint();
      float mCircle;
      int mCx;
      int mCy;
      private RectF oval;
      int startX=180;
      public MyClockView(Context context) {
      super(context);
      initView(context);
      }

    public MyClockView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    initView(context);
    }

    public MyClockView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initView(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    setCircle();
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);

    }

    private void setCircle() {
    width = getMeasuredWidth();
    height = getMeasuredHeight();
    mCircle = width / 2 - 40;
    mCx = width / 2;
    mCy = mCx;

     float xW = width - 40;
     float yH = xW;
     oval = new RectF(40, 40, xW, yH);
    

    }

    private void initView(Context context) {
    this.context = context;
    paintC.setColor(Color.parseColor(c1));
    paintC.setStyle(Paint.Style.STROKE);
    paintC.setStrokeWidth(strokeWidth);
    setPaintStyle(paintC);

     paintA.setColor(Color.parseColor(c2));
     paintA.setStyle(Paint.Style.STROKE);
     paintA.setStrokeWidth(strokeWidth - 8);
     setPaintStyle(paintA);
    
     paintB.setColor(Color.parseColor(c3));
     paintB.setStyle(Paint.Style.STROKE);
     paintB.setStrokeWidth(strokeWidth);
     setPaintStyle(paintB);
    
     paintD.setColor(Color.parseColor(c22));
     paintD.setStyle(Paint.Style.STROKE);
     paintD.setStrokeWidth(strokeWidth + 12);
     setPaintStyle(paintD);
    
     timeNeedlePaint.setColor(Color.RED);
     timeNeedlePaint.setStyle(Paint.Style.FILL);
     timeNeedlePaint.setStrokeWidth(hourHandsStrokeWidth);
     setPaintStyle(timeNeedlePaint);
    
     minuteNeedlePaint.setColor(Color.RED);
     minuteNeedlePaint.setStyle(Paint.Style.FILL);
     minuteNeedlePaint.setStrokeWidth(minuteHandStrokeWidth);
     setPaintStyle(minuteNeedlePaint);
    

    }

    private void setPaintStyle(Paint paint) {
    paint.setAntiAlias(true);//設置抗鋸齒
    paint.setStrokeCap(Paint.Cap.ROUND);
    }

    @Override
    protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    /**
    * 繪製空心圓
    /
    canvas.drawCircle(mCx, mCy, mCircle, paintC);
    /
    *
    * 繪製圓弧 未開始
    /
    canvas.drawArc(oval, -70, 50, false, paintA);
    /
    *
    * 過去
    /
    canvas.drawArc(oval, 90, 60, false, paintB);
    /
    *
    * 已開始
    /
    canvas.drawArc(oval, startX, 60, false, paintD);
    /
    *
    * 繪製指針
    */
    drawScale(canvas);
    handler.sendEmptyMessageDelayed(1,100);
    }

    private void drawScale(Canvas canvas) {
    /**
    * 繪製刻度
    */
    for (int i = 0; i < 24; ++i) {
    //設置大刻度
    if (i % 2 == 0) {
    canvas.drawLine(width / 2, 40 + strokeWidth, width / 2, hourHandsL, timeNeedlePaint);
    } else { //設置小刻度
    canvas.drawLine(width / 2, 40 + strokeWidth, width / 2, minuteHandL, minuteNeedlePaint);
    }
    canvas.rotate(15, width / 2, width / 2);
    }

    }
    Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
    super.handleMessage(msg);
    if (msg.what==1) {
    if (startX>=360) {
    startX=0;
    }
    startX+=10;
    invalidate();
    }
    }
    };
    }`
    就這麼多了,簡單記錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章