轉點來存著

Android - Canvas 簡單總結: http://www.cnblogs.com/hwgt/p/5416866.html

在自定義控件時,經常需要使用canvas、paint等,在canvas類中,繪畫基本都是靠drawXXX()方法來完成的,在這些方法中,很多時候都需要用到paint類型的參數,本文先對paint類常用的一些設置做個簡單總結

paint 屬性設置簡單總結

圖形繪制相關:

public void set(Paint src) ?根據已有畫筆的屬性進行賦值

public void setColor(int color) 設置顏色

public void setAlpha(int alpha) 設置透明度,alpha為透明度,取值范圍為0~255,數值越小越透明

public void setARGB(int a, int r, int g, int b) ?設置透明度和顏色,a代表透明度,r,g,b代表顏色值

public void setAntiAlias(boolean aa)?設置是否使用抗鋸齒功能,比較耗資源,減慢繪制速度

public void setDither(boolean dither)?設定是否使用圖像抖動,如true,繪制出來的圖片顏色更飽滿、清晰

public void setStyle(android.graphics._Original_Paint.Style style)?設置畫筆的樣式,為FILL,FILL_OR_STROKE,或STROKE

以下這段文字來源于網絡,謝謝作者!

當我們在調用drawCircle、drawOval、drawArc、drawRect等方法時,我們既可以繪制對應圖形的填充面,也可以只繪制該圖形的輪廓線,控制的關鍵在于畫筆Paint中的style。Paint通過setStyle方法設置要繪制的類型,style有取三種值:Paint.Style.FILL、Paint.Style.STROKE和Paint.Style.FILL_AND_STROKE。

當style為FILL時,繪制是填充面,FILL是Paint默認的style;

當style為STROKE時,繪制的是圖形的輪廓線;

當style為FILL_AND_STROKE時,同時繪制填充面和輪廓線,不過這種情況用的不多,因為填充面和輪廓線是用同一種顏色繪制的,區分不出輪廓線的效果。

public void setStrokeCap(Cap cap)

當畫筆樣式為STROKE或FILL_OR_STROKE時,設置筆刷的圖形樣式,如圓形樣式 ?Cap.ROUND,或方形樣式Cap.SQUARE

public void setStrokeWidth(float width)?當畫筆樣式為STROKE或FILL_OR_STROKE時,設置筆刷的粗細度

文字繪制相關:

public void setTextSize(float textSize)?設置文字大小

public void setTextScaleX(float scaleX)?設置文字x軸的縮放比例,可以實現文字的拉伸效果

public void setTextSkewX(float skewX) ?設置文字傾斜弧度

public void setUnderlineText(boolean flag)?設置文字下劃線效果

public void setStrikeThruText(boolean flag)?設置刪除線效果

public Typeface setTypeface(Typeface typeface)?設置字體風格

public void setTextAlign(android.graphics._Original_Paint.Align align)?設置文字的對齊方向

其中有兩個屬性設置需要作說明:

1、public Typeface setTypeface(Typeface typeface) ,接收參數為?Typeface對象,在Typeface.java類中,比較簡單的,有defaultFromStyle方法返回Typeface對象:

public static Typeface defaultFromStyle(int style) {}

2、public void setTextAlign(android.graphics._Original_Paint.Align align)?設置文字的對齊方向,接收的參數為Paint的內部枚舉類Align的值,可選LEFT、CENTER和RIGHT。

下邊是文字繪制時常用的屬性設置例子:

publicvoid?draw(Canvas?canvas)?{

super.draw(canvas);

paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));

paint.setColor(Color.RED);

paint.setTextSize(41);

paint.setTextAlign(Align.CENTER);

paint.setTextScaleX(2.5f);

paint.setTextSkewX(-0.5f);

paint.setUnderlineText(true);

paint.setStrikeThruText(true);

canvas.drawText("hwgt的博客",0,41,?paint);

...?...

}

另外,需要注意的是:Canvas的drawText()方法中,如不setTextAlign(... ...)的話,第二個參數 x 默認是字符串的左邊的位置,第三個參數則固定為這個字符串的baseline的位置。

Canvas屬性與方法

首先列出canvas以draw開頭的方法:

設置ARGB、顏色填充畫布:

publicvoid?drawARGB(int?a,int?r,int?g,int?b)?{}

publicvoid?drawColor(int?color)?{}

publicvoid?drawRGB(int?r,int?g,int?b)?{}

canvas.drawARGB(50,255,0,0);//參數即為ARGB的值

畫點:

publicnativevoid?drawPoint(float?x,float?y,?Paint?paint);

//參數比較明顯,就是點的坐標,需要注意的是,在繪制點之前,需要設置畫筆的寬度,否則不能畫出來

paint.setStrokeWidth(13);

//另外,還可以設置畫筆的樣式,來指定所畫的點的樣式,圓形還是方形

paint.setStrokeCap(Paint.Cap.ROUND);//或者paint.setStrokeCap(Paint.Cap.BUTT);

canvas.drawPoint(100,100,?paint);

畫直線:

publicvoid?drawLine(float?startX,float?startY,float?stopX,float?stopY,?Paint?paint)?{}

canvas.drawLine(100,100,500,500,?paint);//參數為起點和終點的XY坐標

畫圓:

publicvoid?drawCircle(float?cx,float?cy,float?radius,?Paint?paint)?{}

canvas.drawCircle(200,200,100,?paint);//參數為圓心坐標和半徑

繪制矩形:

publicvoid?drawRect(float?left,float?top,float?right,float?bottom,?Paint?paint)?{}

publicvoid?drawRect(RectF?rect,?Paint?paint)?{}

publicvoid?drawRect(Rect?r,?Paint?paint)?{}

//?RectF?和?Rect??都可用來定義一個矩形區域,主要區別是參數類型不同,一個是int類型,一個是float類型

private?RectF?mRectF;

mRectF?=new?RectF(100,100,200,500);

canvas.drawRect(mRectF,?paint);

繪制圓角矩形:

publicvoid?drawRoundRect(RectF?rect,float?rx,float?ry,?Paint?paint)?{}

private?RectF?mRectF;

mRectF?=new?RectF(100,100,500,500);//定義一個區域

canvas.drawRoundRect(mRectF,20,50,?paint);//第二、三個參數分別定義x和y方向的圓角弧度

繪制一個區域的內切圓或橢圓(視所定義的矩形而定):

publicvoid?drawOval(RectF?oval,?Paint?paint)?{}

private?RectF?mRectF;

mRectF?=new?RectF(100,100,200,500);

canvas.drawOval(mRectF,?paint);

繪制弧形區域:

publicvoid?drawArc(RectF?oval,float?startAngle,float?sweepAngle,boolean?useCenter,Paint?paint)?{}

private?RectF?mRectF;

mRectF?=new?RectF(100,100,200,200);//定義一個矩形區域

canvas.drawArc(mRectF,0,90,false,?paint);

//第二個參數為起始弧度,第三個為終止弧度,第四個為顯示方式

繪制路徑 — Path 的使用:

publicvoid?drawPath(Path?path,?Paint?paint)?{}

paint.setStyle(Paint.Style.STROKE);

paint.setStrokeWidth(3);

mPath?=new?Path();

mPath.moveTo(100,100);

mPath.lineTo(200,100);

mPath.lineTo(150,150);

mPath.lineTo(150,350);

mPath.close();

canvas.drawPath(mPath,?paint);

繪制路徑,即指定幾個點的坐標,然后按照順序將這些點連接起來,那么,首先需要指定起點,使用moveTo方法,如果沒有使用moveTo方法指定起點的話,默認起點為(0,9),然后用lineTo方法指定需要經過的點,最后,如果起點和終點的坐標不一樣,并且需要將起點和終點連接起來的話,就調用close方法,如不調用close方法的話,起點和終點是不會被連接起來的。

繪制文本:

publicvoid?drawText(String?text,float?x,float?y,?Paint?paint)?{}

publicvoid?drawText(char[]?text,int?index,int?count,float?x,float?y,?Paint?paint)?{}

publicvoid?drawText(String?text,int?start,int?end,float?x,float?y,?Paint?paint)?{}

canvas.drawText("hwgt",100,100,?paint);

canvas.drawText(newchar?[]?{'h','w','g','t','3','1','3','3'},2,3,100,100,?paint);

canvas.drawText("hwgt3133",2,4,100,100,?paint);//含頭不含尾

按照指定點的坐標繪制文本:

publicvoid?drawPosText(String?text,float[]?pos,?Paint?paint)?{}

publicvoid?drawPosText(char[]?text,int?index,int?count,float[]?pos,?Paint?paint)?{}

canvas.drawPosText("hwgt",newfloat[]{50.0f,50.0f,100.0f,100.0f,250.0f,250.0f,500.0f,500.0f,},?paint);

canvas.drawPosText(newchar[]{'h','w','g','t'},3,1,newfloat[]{50.0f,50.0f,100.0f,100.0f,250.0f,250.0f,500.0f,500.0f,},?paint);

//推薦使用第二個方法,if?(index?<?0?||?index?+?count?>?text.length?||?count*2?>?pos.length),就會報錯

按照指定的路徑繪制文本:

publicvoid?drawTextOnPath(String?text,?Path?path,float?hOffset,float?vOffset,?Paint?paint)?{}

canvas的save和restore方法:

在繪制圖形的過程中,會需要對畫布進行旋轉,縮放,平移等操作,但對畫布進行比如平移操作之后,會對以后畫上去的內容也產生影響,有時,我們只希望這種平移或是旋轉操作只是臨時作用于畫布上的某些內容,這個時候就可以使用save和restore方法,save和restore方法一般是配對使用的,例如:

paint.setFakeBoldText(true);//?將畫筆設置為粗體

canvas.drawText("00000000",0,75,?paint);

canvas.save();

canvas.translate(0,250);

canvas.drawText("||||||||||||||||",0,75,?paint);

canvas.restore();

canvas.drawText("—————",0,75,?paint);

去掉save和restore方法即能看出效果。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容