學(xué)習(xí)控件SlantedTextView
SlantedTextView 一個(gè)可以設(shè)置各個(gè)角落橫幅的文本視圖,繼承的View 不是TextView
- 構(gòu)造 ,調(diào)用了
init(attrs) - 在
init(attrs)方法中初始化- 取出各種自定義屬性
- 創(chuàng)建
Paint畫(huà)筆,背景的畫(huà)筆mPaint和文本的畫(huà)筆mTextPaint
- 最關(guān)鍵的一點(diǎn)重寫(xiě)
onDraw()方法,在重寫(xiě)的onDraw方法里做了兩件事drawBackground(canvas)//繪制背景drawText(canvas)//繪制文字
重寫(xiě)的onDarw方法里做點(diǎn)什么
drawBackground(canvas)//繪制背景
- 創(chuàng)建了一個(gè)
Path對(duì)象 - 根據(jù)設(shè)置的模式,繪制
Path的路徑 -
canvas對(duì)象使用path繪制
這里使用
canvas.save()保存了狀態(tài) ,save()和restore()看最后
drawText(canvas)//繪制文字
private void drawText(Canvas canvas) {
int w = (int) (canvas.getWidth() - mSlantedLength / 2);//獲得畫(huà)布寬度減去橫幅寬度的二分之一
int h = (int) (canvas.getHeight() - mSlantedLength / 2);
float[] xy = calculateXY(canvas,w, h); //根據(jù)w,h 算出五個(gè)坐標(biāo)點(diǎn)
float toX = xy[0]; //文字的起始位置x坐標(biāo)
float toY = xy[1]; //文字的起始位置y坐標(biāo)
float centerX = xy[2]; //x旋轉(zhuǎn)中心
float centerY = xy[3]; //y旋轉(zhuǎn)中心
float angle = xy[4]; //旋轉(zhuǎn)的角度
canvas.rotate(angle, centerX , centerY );//旋轉(zhuǎn)相應(yīng)的角度
canvas.drawText(mSlantedText, toX, toY, mTextPaint); //繪制文字,toX和toY分別是文字的起始位置
}
//canvasd的rotate方法指定目標(biāo)點(diǎn)旋轉(zhuǎn)
public final void rotate(float degrees, float px, float py) {
translate(px, py); //1.移動(dòng)到目標(biāo)位置
rotate(degrees); //2.旋轉(zhuǎn)
translate(-px, -py);//3.返回原來(lái)的位置
}
canvas學(xué)習(xí)
-
drawText()的時(shí)候文字是出現(xiàn)在起始坐標(biāo)點(diǎn)的右上方,而且文字并不是全部顯示在y軸之上的
y軸上方占有80%,下方占有剩余的20%。
Screenshot_1497337934_PxCook.png
-
canvas.rotate()畫(huà)布旋轉(zhuǎn)之后會(huì)對(duì)之后所繪制的內(nèi)容產(chǎn)生影響同理,以下這些方法也是影響的之后的繪制內(nèi)容(也就是改變之后的
canvas狀態(tài)):rotatescaletranslateskewconcatclipPath
-
save()和restore()save()只是save()了當(dāng)前這個(gè)canvas()的狀態(tài),和已經(jīng)畫(huà)出來(lái)的圖形無(wú)關(guān),restore()就是取出最近一次save()的canvas()的狀態(tài),仍然不影響圖形。
