Android 自定義View中的Paint凿宾,Canvas的常用方法總結(jié)

paint坠非,Canvas中的常用方法總結(jié)

Paint類的常用方法

  • setColor 方法 误澳,用于設(shè)置畫筆的顏色
  • setAlpha 方法耻矮,用于設(shè)置畫筆的透明度

setAlpha(a : Int) 參數(shù) a 為透明度,其范圍值為 0~255 忆谓,數(shù)值越小越透明

  • setStyle 方法裆装,用于設(shè)置畫筆的風(fēng)格,可以指定是空心還是實心,該方法在矩形哨免、圓形有明顯效果勾扭。

setStyle (style : Paint.Style)//參數(shù) style 為畫筆風(fēng)格
Style.FILL : 實心
Style.FILL_AND_stroke : 實心和空心
Style.stroke : 空心

  • setStrokeWidth 方法,用于設(shè)置畫筆的空心線寬铁瞒,該方法在矩形、圓形桅滋、等圖形中有明顯效果

setStrokeWidth(width : Float) // 參數(shù) width 為線寬慧耍,浮點型數(shù)組

  • setTextSize 方法,用于是個設(shè)置畫筆的字體大小丐谋,主要用于繪制字符串

setTextSize(textSize : Float)

  • setTypeface 方法用于設(shè)置畫筆的字體樣式芍碧,可以使用系統(tǒng)自帶的字段,也可以使用自定義的字體

setTypeface (typeface : Typeface) // typeface 為字體樣式
Typeface.DEFAULT : 默認(rèn)字體
Typeface.DEFAULT_BOLD : 加粗字體
Typeface.MONOSPACE : monospace字體
Typeface.SANS_SERIF : sans字體
Typeface.SERIF : serif字體

  • setTextScaleX 方法.用于設(shè)置畫筆字體的比例因子号俐,默認(rèn)為1泌豆,當(dāng)大于1時表示橫向拉伸,小于1時表示橫向壓縮

setTextScaleX(float scaleX)

  • setARGB方法吏饿,用于設(shè)置畫筆的顏色和透明度

setARGB( a : Int ,r : Int,g : Int,b : Int)
參數(shù)a為透明度踪危,范圍 0~255
參數(shù)r為紅色的顏色值,范圍 0~255
參數(shù)g為綠色的顏色值猪落,范圍 0~255
參數(shù)b為藍(lán)色的顏色值贞远,范圍 0~255

  • setUnderLineText 方法 ,用于設(shè)置畫筆的下劃線

setUnderlineText(Boolean underlintext)

  • setTextSkewX 方法笨忌,用于設(shè)置畫筆的傾斜因子

setTextSkewX(float skewX)
參數(shù)skewX為傾斜因子蓝仲,正數(shù)表示向左傾斜,負(fù)數(shù)表示向右傾斜

Canvas類的常用方法

對 Canvas 進(jìn)行操作

  • Canvas 平移
/**
  * 畫布向(100官疲,50)方向平移
  *
  * 參數(shù)1: 向X軸方向移動100距離
  * 參數(shù)2: 向Y軸方向移動50距離
  */
  canvas.translate( 100 , 50 )
  • Canvas 縮放
/**
  * 在X軸方向放大為原來2倍袱结,Y軸方向方大為原來的4倍
  * 參數(shù)1: X軸的放大倍數(shù)
  * 參數(shù)2: Y軸的放大倍數(shù)
  */
canvas.scale( 2 , 4 );
 
/**
  * 在X軸方向放大為原來2倍,Y軸方向方大為原來的4倍
  * 參數(shù)1: X軸的放大倍數(shù)
  * 參數(shù)2: Y軸的放大倍數(shù)
  * 參數(shù)3: 原點X坐標(biāo)
  * 參數(shù)4: 原點Y坐標(biāo)
  */
canvas.scale( 2 , 4 途凫, 100 , 100 );
  • Canvas 旋轉(zhuǎn)
/**
  * 原點為中心垢夹,旋轉(zhuǎn)30度(順時針方向為正方向 )
  * 參數(shù): 旋轉(zhuǎn)角度
  */
canvas.rotate( 30 );
 
/**
  * 以(100,100)為中心,旋轉(zhuǎn)30度颖榜,順時針方向為正方向
  * 參數(shù): 旋轉(zhuǎn)角度
  */
canvas.rotate( 30 , 100 , 100 );

Canvas 操作例子

 Paint p = new Paint();
p.setColor(Color.argb( 50 , 255 , 100 , 100 ));
canvas.drawRect( 0 , 0 , 200 , 200 ,p); // 以原始Canvas畫出一個矩形1
canvas.translate( 300 , 300 ); // 將Canvas平移 (100,100)
p.setColor(Color.argb( 50 , 100 , 255 , 100 ));
canvas.drawRect( 0 , 0 , 200 , 200 ,p); // 矩形2
canvas.rotate( 30 ); //將Canvas旋轉(zhuǎn)30
p.setColor(Color.argb( 50 , 100 , 0 , 255 ));
canvas.drawRect( 0 , 0 , 200 , 200 ,p); // 矩形3
canvas.scale( 2 , 2 ); // 將Canvas以原點為中心棚饵,放大兩倍
p.setColor(Color.argb( 50 , 255 , 255 , 0 ));
canvas.drawRect( 0 , 0 , 200 , 200 ,p); // 矩形4
  • Canvas 保存和還原

Canvas提供了幾個方法,讓我們可以方便的對Canvas的狀態(tài)進(jìn)行更改和還原掩完。
這些方法是:save() 噪漾、restore() 、restoreToCount(int saveCount)

我們在對Canvas進(jìn)行平移且蓬、旋轉(zhuǎn)欣硼、放大等操作時候,可以調(diào)用save()方法恶阴,將當(dāng)前修改過的Canvas狀態(tài)進(jìn)行保存诈胜,調(diào)用restore() 方法后豹障,會將Canvas還原成最近的一個save() 的狀態(tài)。

save()方法還會有一個返回值焦匈,我們也可以調(diào)用restoreToCount(int saveCount)方法血公,將這個返回值作為參數(shù)傳遞進(jìn)去,就可以將Canvas還原成某一個特定的save()狀態(tài)缓熟。

canvas.translate( 100 , 100 ); // 平移(100,100)
int save1 = canvas.save(); // 保存Canvas狀態(tài)(狀態(tài)1)
canvas.scale( 2 , 2 ); // 放大2倍
int save2 = canvas.save(); // 保存Canvas狀態(tài)(狀態(tài)2)
canvas.restore(); // 返回最新的save狀態(tài)累魔,即狀態(tài)2
canvas.restoreToCount(save1); // 手動指定的返回到 狀態(tài)1
  • Canvas畫圖實例
    1、畫文字
/**
  * 參數(shù)2:文本的x軸的開始位置
  * 參數(shù)2:文本Y軸的結(jié)束位置
  * 參數(shù)3:畫筆對象
  */
canvas.drawText( "開始寫字了够滑!" , 50 , 50 , p); // 畫文本
 
/**
  * 參數(shù)2:要從第幾個字開始繪制
  * 參數(shù)3:要繪制到第幾個文字
  * 參數(shù)4:文本的x軸的開始位置
  * 參數(shù)5:文本Y軸的結(jié)束位置
  * 參數(shù)6:畫筆對象
  */
canvas.drawText( "開始寫字了垦写!" , 2 , 5 , 50 , 50 , p); // 畫文本,結(jié)果為:“寫字了”
/**
  * 參數(shù)2:路徑
  * 參數(shù)3:距離路徑開始位置的偏移量
  * 參數(shù)4:距離路徑上下的偏移量(可以為負(fù)數(shù))
  * 參數(shù)5:畫筆對象
  */
canvas.drawTextOnPath( "1234567890101123123" , path, 0 , - 50 , p);

2彰触、畫圓

/**
  * 參數(shù)1:圓心X
  * 參數(shù)2:圓心Y
  * 參數(shù)3:半徑R
  * 參數(shù)4:畫筆對象
  */  
canvas.drawCircle( 200 , 200 , 100 , p);

3梯投、畫線

/*
  * 參數(shù)1:startX
  * 參數(shù)2:startY
  * 參數(shù)3:stopX
  * 參數(shù)4:stopY
  * 參數(shù)5:畫筆對象
  */
canvas.drawLine(100, 100, 300, 300, p);// 畫線
/*
  * 同時繪制多條線。
  * 參數(shù)1:float數(shù)組:每四個一組為一條線况毅。最后不足四個分蓖,就忽略那些值。
  * 參數(shù)2:畫筆對象
  */
canvas.drawLines( new float []{ 100 , 100 , 200 , 200 , 200 , 100 , 300 , 100 }, p);

4俭茧、 畫橢圓

/*
  * 參數(shù)1:float left
  * 參數(shù)2:float top
  * 參數(shù)3:float right
  * 參數(shù)4:float bottom
  */
RectF oval = new RectF( 150 , 200 , 500 , 400 ); // 畫一個橢圓
canvas.drawOval(oval, p);

5咆疗、畫弧度

/**
  * 畫圓弧
  * 參數(shù)1:RectF對象。
  * 參數(shù)2:開始的角度母债。(水平向右為0度順時針反向為正方向)
  * 參數(shù)3:掃過的角度
  * 參數(shù)4:是否和中心連線
  * 參數(shù)5:畫筆對象
  */
canvas.drawArc(oval, 20 , 180 , false , p);

6午磁、畫矩形

/**
  * 矩形
  * 參數(shù)1:float left
  * 參數(shù)2:float top
  * 參數(shù)3:float right
  * 參數(shù)4:float bottom
  */
canvas.drawRect( 100 , 100 , 200 , 200 , p);
 
//畫圓角矩形
RectF oval3 = new RectF( 80 , 260 , 200 , 300 ); // 設(shè)置個新的長方形
canvas.drawRoundRect(oval3, 20 , 5 , p); //第二個參數(shù)是x半徑,第三個參數(shù)是y半徑

7毡们、畫多邊形

/**
  * Path類封裝復(fù)合(多輪廓幾何圖形的路徑
  * 由直線段*迅皇、二次曲線,和三次方曲線,也可畫以油畫衙熔。drawPath(路徑登颓、油漆),要么已填充的或撫摸
  * (基于油漆的風(fēng)格),或者可以用于剪斷或畫畫的文本在路徑。
  */
Path path = new Path(); // 路徑對象
path.moveTo( 80 , 200 ); // 此點為多邊形的起點
path.lineTo( 120 , 250 );
path.lineTo( 80 , 250 );
//.... 可以添加多個點红氯。構(gòu)成多邊形
path.close(); // 使終點和起點鏈接框咙,構(gòu)成封閉圖形
canvas.drawPath(path, p);

8、 畫貝塞爾曲線

p.setStyle(Style.STROKE);
Path path2= new Path();
path2.moveTo( 100 , 100 ); //設(shè)置Path的起點
/**
  * 參數(shù)1痢甘、2:x1喇嘱,y1為控制點的坐標(biāo)值
  * 參數(shù)3、4:x2塞栅,y2為終點的坐標(biāo)值
  */
path2.quadTo( 300 , 100 , 400 , 400 ); //設(shè)置貝塞爾曲線的控制點坐標(biāo)和終點坐標(biāo)
path2.quadTo( 500 , 700 , 800 , 800 );
canvas.drawPath(path2, p); //畫出貝塞爾曲線

9者铜、畫點

/**
  * 參數(shù)1、2:點的x、y坐標(biāo)
  */
canvas.drawPoint( 60 , 390 , p); //畫一個點
/**
  * 參數(shù)1:多個點作烟,每兩個值為一個點愉粤。最后個數(shù)不夠兩個的值,忽略拿撩。
  */
canvas.drawPoints( new float []{ 60 , 400 , 65 , 400 , 70 , 400 }, p); //畫多個點

10衣厘、畫圖片


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市压恒,隨后出現(xiàn)的幾起案子头滔,更是在濱河造成了極大的恐慌,老刑警劉巖涎显,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異兴猩,居然都是意外死亡期吓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門倾芝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讨勤,“玉大人,你說我怎么就攤上這事晨另√肚В” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵借尿,是天一觀的道長刨晴。 經(jīng)常有香客問我,道長路翻,這世上最難降的妖魔是什么狈癞? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮茂契,結(jié)果婚禮上蝶桶,老公的妹妹穿的比我還像新娘。我一直安慰自己掉冶,他們只是感情好真竖,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厌小,像睡著了一般恢共。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上召锈,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天旁振,我揣著相機(jī)與錄音,去河邊找鬼。 笑死拐袜,一個胖子當(dāng)著我的面吹牛吉嚣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蹬铺,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼尝哆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了甜攀?” 一聲冷哼從身側(cè)響起秋泄,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎规阀,沒想到半個月后恒序,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谁撼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年歧胁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厉碟。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡喊巍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出箍鼓,到底是詐尸還是另有隱情崭参,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布款咖,位于F島的核電站何暮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏铐殃。R本人自食惡果不足惜郭卫,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望背稼。 院中可真熱鬧贰军,春花似錦、人聲如沸蟹肘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帘腹。三九已至贰盗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阳欲,已是汗流浹背舵盈。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工陋率, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秽晚。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓瓦糟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赴蝇。 傳聞我的和親對象是個殘疾皇子菩浙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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