自定義View——drawXXX

前言

既然要自定義View衫贬,那么自然少不了各種繪制,既然要繪制吆鹤,那么自然離不開Canvas和Paint宝泵,那么本篇文章就介紹一下好啰,canvas的各種drawXXX方法和Paint一些常用方法。

Android中的坐標(biāo)系

Android中的坐標(biāo)系的X軸與傳統(tǒng)的坐標(biāo)系一致儿奶,但是Y軸與傳統(tǒng)的坐標(biāo)系不同框往,方向是相反的。


Paint常用方法

  • Paint.setStyle(Style style) 設(shè)置繪制模式

  • Paint.setColor(int color) 設(shè)置顏色

  • Paint.setStrokeWidth(float width) 設(shè)置線條寬度

  • Paint.setTextSize(float textSize) 設(shè)置文字大小

  • Paint.setAntiAlias(boolean aa) 設(shè)置抗鋸齒開關(guān)


    抗鋸齒關(guān)閉與開啟
  • Paint.setDither(boolean dither) 設(shè)置防抖動開關(guān)


    防抖動未開啟

    防抖動開啟

onDraw()

以下所有操作均是在onDraw()中進(jìn)行的闯捎,把繪制代碼寫在 onDraw() 里面椰弊,就是自定義繪制最基本的實現(xiàn)许溅。

canvas.drawColor(@ColorInt int color) 顏色填充

在整個繪制區(qū)域統(tǒng)一涂上指定的顏色,當(dāng)然你也可以傳入帶透明度的顏色秉版,達(dá)到遮罩層的效果

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.YELLOW);
    }
drawColor

canvas.drawCircle 畫圓

canvas.drawCircle(float centerX, float centerY, float radius, Paint paint)

  • centerX贤重,centerY:確定圓心的坐標(biāo)
  • radius:確定圓的半徑
canvas.drawCircle(300f, 300f, 200f, mPaint);
drawCircle

補充

Paint.setColor(int color)改變畫筆的顏色

mPaint.setColor(Color.BLUE);
canvas.drawCircle(200f, 400f, 100f, mPaint);
BLUE

Paint.setStyle(Paint.Style style)改變畫筆的風(fēng)格

Style有三種,分別是FILL, STROKE 和 FILL_AND_STROKE清焕。

  • FILL:填充模式(默認(rèn))
  • STROKE:勾邊模式
  • FILL_AND_STROKE:兩種模式一并使用并蝗,既畫線又填充
mPaint.setStyle(Paint.Style.STROKE);
canvas.drawCircle(500f, 100f, 100f, mPaint);
STROKE

Paint.setStrokeWidth(float width)設(shè)置線條寬度

mPaint.setStrokeWidth(20f);
canvas.drawCircle(500f, 500f, 100f, mPaint);
setStrokeWidth

canvas.drawRect 畫矩形

畫矩形有三種方法

  • drawRect(RectF rect, Paint paint)
  • drawRect(Rect rect, Paint paint)
  • drawRect(float left, float top, float right, float bottom, Paint paint)
  • left,top,right,bottom:這4個參數(shù)的意思我在下圖中標(biāo)記出來

這里有朋友可能就要問了,Rect和RectF有什么區(qū)別秸妥?
簡單來說滚停,最大的不同就是精度不同,一個傳int類型粥惧,傳float類型键畴,至于其他的不同這里暫時先不說,也用不到突雪。

canvas.drawRect(200f,100f,400f,300f,paint);
等價于
RectF rectF = new RectF(200f,100f,400f,300f);
canvas.drawRect(rectF,paint);
drawRect

canvas.drawPoint 畫點

canvas.drawPoint(float x, float y, Paint paint)

  • x,y:圓點的坐標(biāo)
  • 點的大辛场:paint.setStrokeWidth(width)
  • 點的形狀:paint.setStrokeCap(cap) ,ROUND圓形挂签,SQUARE或BUTT方形(默認(rèn))。
paint.setStrokeWidth(40);

paint.setStrokeCap(Paint.Cap.ROUND);
canvas.drawPoint(100f,100f,paint);

paint.setStrokeCap(Paint.Cap.BUTT);
canvas.drawPoint(600f,300f,paint);
drawPoint

canvas.drawPoints 批量畫點

批量畫點有兩種方法

  • canvas.drawPoints(float[] pts, int offset, int count, Paint paint)
  • canvas.drawPoints(float[] pts, Paint paint)
  • pts:點的坐標(biāo)數(shù)組
//繪制八個點(50,50)(100,50)(150,50)(200,50)
//(50,100)(100,100)(150,100)(200,100)
float[] pts = {50,50,100,50,150,50,200,50,50,100,100,100,150,100,200,100};
canvas.drawPoints(pts,paint);
drawPoints
  • offset:從數(shù)組中的第幾個index開始取
  • count:取幾個

舉個例子盼产,我們傳offset為2,count為4饵婆,再傳offset為1,count為4看看效果

顯然這兩個點的坐標(biāo)為(100戏售,50)和(150侨核,50)


offset為2

這兩個點的坐標(biāo)為(50,100)和(50灌灾,150)


offset為1

canvas.drawOval 畫橢圓

畫橢圓有兩種方法

  • drawOval(RectF rect, Paint paint)
  • drawOval(float left, float top, float right, float bottom, Paint paint)
canvas.drawOval(300f,300f,600f,450f,paint);
drawOval

其實我們可以理解為下圖
oval.png

當(dāng)然我們也可以使用Paint.setStyle(Paint.Style style)繪制出空心橢圓搓译,這里就不演示了,參考上面的drawRect()锋喜。

canvas.drawLine 畫線

canvas.drawLine(float startX, float startY, float stopX, float stopY, Paint paint)

  • startX些己,startY:起始點的坐標(biāo)
  • stopX,stopY:結(jié)束點的坐標(biāo)

兩點確定一條直線嘿般。段标。。炉奴,當(dāng)然我們也可以使用paint.setStrokeWidth()改變線的寬度逼庞。

canvas.drawLine(100,100,400,100,paint);
paint.setStrokeWidth(10);
canvas.drawLine(100,300,400,300,paint);
drawLine

canvas.drawLines 批量畫線

批量畫線有兩種方法

  • canvas.drawLines(float[] pts, int offset, int count, Paint paint)
  • canvas.drawLines(float[] pts, Paint paint)

這里的參數(shù)與上面畫點是一樣的。

//(50瞻赶,50)(150赛糟,50)(100派任,0)(100,150)(100璧南,50)(50掌逛,150)(100,50)(150穆咐,150)
float[] pts = {50,50,150,50,100,0,100,150,100,50,50,150,100,50,150,150};
canvas.drawLines(pts,paint);

本來想畫個李字的颤诀,想了想,點太多了对湃,畫個木字算了崖叫,哈哈哈,請原諒我懶拍柒。心傀。。


drawLines

canvas.drawRoundRect 畫圓角矩形

  • rx,ry:圓角的橫向半徑和縱向半徑

畫圓角矩形有兩種方法

  • drawRoundRect(RectF rect, float rx, float ry, Paint paint)
  • drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint)
 canvas.drawRoundRect(200f,300f,600f,500f,20f,20f,paint);
drawRoundRect

canvas.drawArc 繪制弧形或扇形

canvas.drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)

  • left,top,right,bottom:還是用來確定繪制位置的
  • startAngle:起始角度
  • sweepAngle:劃過的角度
  • useCenter:是否連接到圓心

這里首先我們要確定一個概念拆讯,0度在哪里脂男,直接貼圖


角度坐標(biāo)圖
RectF rectF = new RectF(300f,200f,500f,400f);

paint.setStyle(Paint.Style.FILL);//填充模式
canvas.drawArc(rectF, -110f, 100f, false, paint);//不連接圓心的填充弧形
canvas.drawArc(rectF,20f,140f,true,paint);//連接圓心的填充扇形

paint.setStyle(Paint.Style.STROKE);//鉤邊模式
canvas.drawArc(rectF,-160f,40f,false,paint);//不連接圓心的弧形
canvas.drawArc(rectF,170f,20f,true,paint);//連接圓心的扇形
drawArc

canvas.drawBitmap 畫 Bitmap

canvas.drawBitmap(Bitmap bitmap, float left, float top, Paint paint)

canvas.drawBitmap(bitmap,20f,20f,paint);
drawBitmap

canvas.drawText 繪制文字

canvas.drawText(String text, float x, float y, Paint paint)

paint.setTextSize(20);
canvas.drawText("LXT",50f,100f,paint);

paint.setTextSize(30);
canvas.drawText("LXT",50f,200f,paint);

paint.setTextSize(40);
canvas.drawText("LXT",50f,300f,paint);

paint.setTextSize(50);
canvas.drawText("LXT",50f,400f,paint);
drawText
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市种呐,隨后出現(xiàn)的幾起案子宰翅,更是在濱河造成了極大的恐慌,老刑警劉巖爽室,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汁讼,死亡現(xiàn)場離奇詭異,居然都是意外死亡阔墩,警方通過查閱死者的電腦和手機嘿架,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啸箫,“玉大人耸彪,你說我怎么就攤上這事⊥粒” “怎么了蝉娜?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扎唾。 經(jīng)常有香客問我蜀肘,道長,這世上最難降的妖魔是什么稽屏? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任扮宠,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坛增。我一直安慰自己获雕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布收捣。 她就那樣靜靜地躺著届案,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罢艾。 梳的紋絲不亂的頭發(fā)上楣颠,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音咐蚯,去河邊找鬼童漩。 笑死,一個胖子當(dāng)著我的面吹牛春锋,可吹牛的內(nèi)容都是我干的矫膨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼期奔,長吁一口氣:“原來是場噩夢啊……” “哼侧馅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呐萌,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤馁痴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肺孤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弥搞,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年渠旁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片船逮。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡顾腊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挖胃,到底是詐尸還是另有隱情杂靶,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布酱鸭,位于F島的核電站吗垮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凹髓。R本人自食惡果不足惜烁登,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔚舀。 院中可真熱鬧饵沧,春花似錦锨络、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至是钥,卻和暖如春掠归,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悄泥。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工虏冻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人码泞。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓兄旬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親余寥。 傳聞我的和親對象是個殘疾皇子领铐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容