自定義控制元件學習之繪製刻度盤
阿新 • • 發佈:2018-11-05
以前面試的時候面試官問過我會不會寫標尺工具,我沒做過呀,然後胡亂的說什麼畫布,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 intmeasureDim(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); } }大功告成 效果就這樣
很簡單,其他功能或者有趣的東西我以後可能回去加,就當學習一種思路,有些東西你去試過以後就不會感覺它高不可攀了。。