自定义控件的编写,肯定是大多数初学者的魔音哈。那么我在这讲一下,我自己在编写自定义控件中代码中的思路
首先:确定自己要自定义的控件,是可以继承已有的系统控件进行编写,还是得继承View,完全自己写。
第二:你得知道View绘制的几个步骤
1.onMeasure: 只有测算了之后,才能获取View的高度和宽度
onMeasure有三种测量mode:
(1) EXACTLY :根据specSize设置
(2) At_MOST:子视图最大的size设置
(3) UNSPECIFIED :没任何限制,不太常用
我们可以通过MeasureSpec.makeMeasureSpec(size,mode) 对View进行配置。
2.onLayout:这个只有在复写ViewGroup的时候才需要重写
3.onDraw:绘制,就是绘制具体的内容
那么,偶就来举个简单的栗子: 比如说,想要做一个温度刻度类的东西如下图所示:
上图的这个需求很简单,跟着我的思路走:
1.能不能继承已有的控件? 不可以,需要自己继承View自定义
2.需要重写哪些方法?首先是onMeasure,因为需要对刻度进行计算
然后是onDraw,需要自己绘制图形
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //每一个刻度的宽度 degreeWidth = getMeasuredWidth()/80; }
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //首先画一条直线 Paint linePaint = new Paint(); linePaint.setAntiAlias(true); linePaint.setColor(getResources().getColor(R.color.colorAccent)); canvas.drawLine(0, 50, getWidth(), 50, linePaint); //然后在线上画刻度 Paint degreePaint = new Paint(); degreePaint.setStrokeWidth(3); int xDgree = 0; for(int i = 0;i<80;i++){ //当它为正数的时候,线要更长,并且要有字 if(i % 10 == 0){ degreePaint.setStrokeWidth(3); degreePaint.setTextSize(15); degreePaint.setColor(getResources().getColor(R.color.colorAccent)); int x = i/10; int degreeX = x*degreeWidth*10; canvas.drawLine(degreeX +degreeWidth*5 ,30,degreeX+degreeWidth*5,50,degreePaint); //刻度值为 degree = x +35; //可以测量出text的长度 float degreeLength = degreePaint.measureText(String.valueOf(degree)); //为了让text位置相对刻度居中,所以需要在绘制text的时候除以2 canvas.drawText(String.valueOf(degree),degreeX+degreeWidth*5-degreeLength/2,25,degreePaint); }else{ //对小刻度进行绘制 if(i<=70) { degreePaint.setStrokeWidth(1); degreePaint.setColor(getResources().getColor(R.color.colorPrimary)); canvas.drawLine(degreeWidth * 5 + i * degreeWidth, 40, degreeWidth * 5 + i * degreeWidth, 50, degreePaint); } } }
资源下载:http://download.youkuaiyun.com/detail/qq_29375071/9380383
android studio直接运行
android
studio直接运行