1. 程式人生 > >自定義控制元件學習之繪製刻度盤

自定義控制元件學習之繪製刻度盤

以前面試的時候面試官問過我會不會寫標尺工具,我沒做過呀,然後胡亂的說什麼畫布,ondraw繪製。。然後就沒有然後了--!,現在想想真的有點囧。所以今天我試了下自己畫刻度盤,不是很難,只有方法對了,輕輕鬆鬆。。大神勿噴,這是菜鳥的日常(高手退散退散。。巴拉巴拉能量**>_<**)

還是老樣子,程式碼寫到最後都是規律,就和學習一樣,第一步在onMeasure方法中去計算控制元件的寬高,你也可以不寫,但是在wrap_content的時候回很蛋疼····上程式碼
/**
 * 第一步
 */
@Override
protected void onMeasure(int 
widthMeasureSpec, int heightMeasureSpec) { int width =measureDim(widthMeasureSpec,150); int height = measureDim(heightMeasureSpec,150); if (width!=height){ width=Math.max(width,height); height =width; } setMeasuredDimension(width,height); initView(); } public int
measureDim(int Spec,int defultsize){ int result; int mode = MeasureSpec.getMode(Spec); int size = MeasureSpec.getSize(Spec); if (mode==MeasureSpec.EXACTLY){ result =size; }else { result =defultsize; if (mode==MeasureSpec.AT_MOST){ result =Math.min
(size,defultsize); } } return result; } public void initView(){ cPaint = new Paint(); cPaint.setAntiAlias(true); cPaint.setColor(Color.BLUE); cPaint.setStyle(Paint.Style.STROKE); cPaint.setStrokeWidth(2); cPaint.setTextSize(12); list = new ArrayList<>(); }
第二步畫一個圓
@Override
protected void onDraw(Canvas canvas) {
    radio =getMeasuredWidth()/2-20;
    canvas.drawCircle(radio,radio,radio,cPaint);
    canvas.drawPoint(radio,radio,cPaint);
    scaleCount(canvas);
}
第三步就是對刻度座標的計算,根據計算每個刻度是6度,那麼就簡單了
/**
 * 錶盤刻度的計算,繪製
 */
private void scaleCount(Canvas canvas){
    double startx;
    double starty;
    double endx;
    double endy;
    for (int i=0;i<60;i++){
        if (i%5==0){
            endx= Math.sin( Math.toRadians(i*6))*(radio/2+10)+radio;
            endy = radio-Math.cos( Math.toRadians(i*6))*(radio/2+10);

            /*
            這段繪製刻度值有點問題字歪的 ,以後改善
             */
         /*
            double textX = Math.sin( Math.toRadians(i*6))*(radio/2+9)+radio;
            double textY = radio-Math.cos( Math.toRadians(i*6))*(radio/2+9);
            canvas.drawText((i/5==0?12:i/5)+"",(float) textX,(float)textY,cPaint);*/
        }else {
            endx= Math.sin( Math.toRadians(i*6))*(radio-10)+radio;
            endy = radio-Math.cos( Math.toRadians(i*6))*(radio-10);
        }
        startx  =Math.sin( Math.toRadians(i*6))*(radio)+radio;
        starty  = radio-Math.cos( Math.toRadians(i*6))*(radio);
        Line line = new Line(startx,starty,endx,endy);
        list.add(line);
    }
    drawLine(canvas);
}

public void drawLine(Canvas canvas){
    cPaint.reset();
    cPaint.setColor(Color.BLACK);
    cPaint.setStyle(Paint.Style.FILL);
    cPaint.setAntiAlias(true);
    for (int i=0;i<list.size();i++){
        canvas.drawLine((float) list.get(i).getStartx(),(float)list.get(i).getStarty(),(float)list.get(i).getEndx(),
                (float)list.get(i).getEndy(),cPaint);
    }
}
大功告成 效果就這樣

很簡單,其他功能或者有趣的東西我以後可能回去加,就當學習一種思路,有些東西你去試過以後就不會感覺它高不可攀了。。