自定義繪制圖片--參照上文,繪制了一個(gè)鐘表
其實(shí)學(xué)習(xí)知識(shí),只有自己一邊繪制,一邊了解才會(huì)學(xué)習(xí)的快呢,文章最后會(huì)附上項(xiàng)目地址:
不管是繪制多么復(fù)雜的控件,都需要一步一步的進(jìn)行,
-
首先是在繪制之前先重寫onMeasure()方法,測量和設(shè)置控件的一些大小
setMeasuredDimension(measure(widthMeasureSpec, true), measure(heightMeasureSpec, false));int specMode = MeasureSpec.getMode(origin);//得到模式 int specSize = MeasureSpec.getSize(origin);//得到尺寸
判斷specMode:
// EXACTLY是精確尺寸,當(dāng)我們將控件的layout_width或layout_height指定為具體數(shù)值時(shí)如"50dip",或者為FILL_PARENT是,都是控件大小已經(jīng)確定的情況,都是精確尺寸。
case MeasureSpec.EXACTLY:
//AT_MOST是最大尺寸,當(dāng)控件的layout_width或layout_height指定為WRAP_CONTENT時(shí),控件大小一般隨著控件的子空間或內(nèi)容進(jìn)行變化,此時(shí)控件尺寸只要不超過父控件允許的最大尺寸即可
case MeasureSpec.AT_MOST:
//UNSPECIFIED是未指定尺寸,這種情況不多,一般都是父控件是AdapterView,通過measure方法傳入的模式。
case MeasureSpec.UNSPECIFIED:
-
首先是繪制外面最大的圓形
//畫外圓
float borderWidth = DEFAULT_BORDER_WIDTH;
float r = Math.min(getHeight() / 2, getWidth() / 2) - borderWidth / 2;//半徑
Paint paintCircle = new Paint();/** * Paint.Style.FILL :填充內(nèi)部 Paint.Style.FILL_AND_STROKE :填充內(nèi)部和描邊 Paint.Style.STROKE :僅描邊 */ paintCircle.setStyle(Paint.Style.STROKE);//設(shè)置填充樣式 paintCircle.setAntiAlias(true);//抗鋸齒功能 paintCircle.setStrokeWidth(borderWidth);//設(shè)置畫筆寬度 canvas.drawCircle(getWidth() / 2, getHeight() / 2, r, paintCircle);//畫圓,圓心在中心位置,半徑為長寬小者的一半
不知道為什么復(fù)制代碼的時(shí)候,格式就亂了還要一個(gè)一個(gè)的去修改,這里我就不貼了,直接上傳我的
github項(xiàng)目
有興趣的同學(xué)可以看下,代碼里面的注視很全,應(yīng)該都可以看得懂