本文主要是介绍自定义控件学习之绘制刻度盘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
以前面试的时候面试官问过我会不会写标尺工具,我没做过呀,然后胡乱的说什么画布,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); } }大功告成
效果就这样
很简单,其他功能或者有趣的东西我以后可能回去加,就当学习一种思路,有些东西你去试过以后就不会感觉它高不可攀了。。
这篇关于自定义控件学习之绘制刻度盘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!