黃 凱高級講師
多年移動互聯(lián)網(wǎng)開發(fā)經(jīng)驗(yàn),精通Android與iOS開發(fā),對JavaEE等后臺技術(shù)也 有所研究。尤其精通Android平臺的開發(fā),對Android平臺下的性能優(yōu)化有極其豐富的經(jīng)驗(yàn)。 曾就職于酷狗音樂擔(dān)任高級Android軟件工程師與Team Leader一職,帶領(lǐng)超過20人的開發(fā)團(tuán)隊(duì),有豐富的開發(fā)與管理經(jīng)驗(yàn)。參與開發(fā)了<酷狗音樂>,<繁星網(wǎng)>,<中國電信移動辦公>, <智慧天河>,<翼健康>,<創(chuàng)餉無限>,<外修管家>等20多款互聯(lián)網(wǎng)熱門應(yīng)用。其不但開發(fā)經(jīng)驗(yàn)豐富,教學(xué)幽默風(fēng)趣,而且對 學(xué)生要求嚴(yán)格,堅持授人與魚不如授人與漁的理念,注重培養(yǎng)學(xué)生的解決問題與自我思考的能力。
現(xiàn)在學(xué)習(xí)Java還有前途嗎?
在互聯(lián)網(wǎng)行業(yè),Java工程師是一個技術(shù)含量非常高的崗位,支撐了互聯(lián)網(wǎng)行 業(yè)的半壁江山,全世界有一千萬Java程序員,目前還在有更多的計算機(jī)愛好者向Java的大門奔來。Java發(fā)展了20多年,關(guān)于Java的悲觀論調(diào)也不時出現(xiàn) ,現(xiàn)在學(xué)Java還有前途嗎?是否已經(jīng)過了紅利期了呢?
Java作為所有編程語言中熱門技術(shù),可以說它無處不在,目前全球有著數(shù)十 億的設(shè)備正在運(yùn)行著Java,很多服務(wù)器程序都是用Java編寫,用以處理每天超過數(shù)以千萬的數(shù)據(jù)。
無論是手機(jī)軟件、手機(jī)Java游戲還是電腦軟件,每一次購物到每一筆支付成 功,都離不開Java,越來越多的企業(yè)也正采用Java語言開發(fā)網(wǎng)站,而在所有程序員中,Java開發(fā)工程師就占據(jù)了20%的比例。
從國內(nèi)排名靠前網(wǎng)站的主要開發(fā)語言,也可以看出Java在各大開發(fā)語言中的 地位。淘寶、搜狐、網(wǎng)易等一線互聯(lián)網(wǎng)公司,都在使用Java開發(fā)語言。
這也不難理解,為什么Java現(xiàn)在這么火爆,吸引越來越多的人學(xué)習(xí),根本原 因,還是因?yàn)槠髽I(yè)對Java的認(rèn)可和應(yīng)用。
Java有沒有前途,需要我們認(rèn)清自己今后應(yīng)該怎么走自己的路線,是走技術(shù) ,還是走管理。走技術(shù)路線:從初級、中級、高級再到軟件架構(gòu)師。如果說走管理路線:項(xiàng)目經(jīng)理、部門經(jīng)理、技術(shù)總監(jiān)。只有清楚了自己要走的路線 后,再往決定的那一方面去努力,學(xué)習(xí)。除此以外,還有一些人學(xué)了這一專業(yè)后,從事銷售顧問、培訓(xùn)講師、自己創(chuàng)業(yè)的都有,關(guān)鍵是自己要認(rèn)識自己 ,自己更適何哪一條路。
所以,先認(rèn)清“正確的結(jié)果”,根據(jù)正確的結(jié)果去設(shè)計你的過程。當(dāng)一個人 具有明確的職業(yè)目標(biāo)時,就會對有助于實(shí)現(xiàn)目標(biāo)的蛛絲馬跡都特別敏感,做事情相應(yīng)也就會很有目的性,而不是稀里糊涂的。所以,就容易到達(dá)自己的 目的。如果沒有職業(yè)目標(biāo),腳踩西瓜皮滑到哪里是哪里,學(xué)什么技術(shù)都沒前途。
在未來的幾年,Java工程師人才的需求還在不斷的加大,由于人才的緊缺, 這個崗位相對于其它專業(yè)薪資待遇還是不錯的,而且Java工程師的待遇是與工作經(jīng)驗(yàn)直接掛勾的,當(dāng)你有了豐富的經(jīng)驗(yàn)以后,你在這個行業(yè)里就比較搶 手了,而且企業(yè)所出的薪酬也是相當(dāng)高的,到時只有你選擇他們了。
Java編程語言概述
Java編程語言概述
1.Java編程語言發(fā)展簡史
2.Java編程語言主要特征
3.Java技術(shù)體系平臺
4.Java核心機(jī)制與JVM運(yùn)行原理
5.搭建 Java開發(fā)環(huán)境
6.JDK 的安裝與配置
7.開發(fā)體驗(yàn) Java 應(yīng)用程序
8.Java 程序的執(zhí)行原理
9.Java Code Style
10.變量的聲明與使用
11.變量內(nèi)存空間分配與原理
12.進(jìn)制與位運(yùn)算
13.變量的數(shù)據(jù)類型
14.數(shù)據(jù)類型之間的轉(zhuǎn)換
15.變量的運(yùn)算與底層運(yùn)算原理
Android繪圖篇-01 Canvas和Paint的基礎(chǔ)使用
>
一Paint和Canvas Paint設(shè)置填充樣式 文字添加陰影 給Canvas設(shè)置背景色 畫直線 畫點(diǎn) 畫矩形 圓角矩形 圓形 橢圓 弧 二Path和DrawTetx練習(xí) Path直線 Path矩形 Path圓角矩形 其他Path圖形 Paint關(guān)于文字屬性的設(shè)置 文字對應(yīng)canvas繪制方式
看到效果還是很基礎(chǔ)的東西.下面開始整理實(shí)現(xiàn)方法 源碼**: 查找SuGraphicsBaseCanvaspaintActivity類, 手機(jī)查看效果一級界面進(jìn)入選擇graphics模塊
一.Paint和Canvas
自定義過View的對這兩個屬性應(yīng)該不陌生. Paint畫筆
, Canvas畫布
. 有了這兩個條件我們就可以做很多的事情.
如果你想直接畫某一個圖形那么就是用Canvas,如果你想設(shè)置一些屬性如文字粗細(xì),大小,顏色那么就使用Paint.
當(dāng)我們要自定義View的使用,要養(yǎng)成在構(gòu)造函數(shù)
中創(chuàng)建出了Paint畫筆對象,而不是在onDraw()
,因?yàn)閛nDraw可能會在后續(xù)中頻繁的刷新,如果在這其中設(shè)置了一些初始化的操作,那么就毫無意義并且浪費(fèi)資源.
我們看一個Paint的基本屬性設(shè)置:
注意本文或者后續(xù)文章中mDensity變量為當(dāng)前屏幕密度比值,代碼中使用是為了適配所有尺寸的手機(jī)都可以同比例的顯示出來.如(720*1080(比值為2), 1080*1920(比值為3), 1440*2560(比值為4))
//開始設(shè)置畫筆的基本信息 mPaint.setAntiAlias(true); //設(shè)置畫筆的抗鋸齒 mPaint.setColor(Color.WHITE); //設(shè)置畫筆的顏色 mPaint.setStyle(Paint.Style.FILL); //設(shè)置畫出的圖形填充的類型,fill為內(nèi)部填充,stroke為只有邊框,內(nèi)容不填充 mPaint.setStrokeWidth(mDensity * 2); //設(shè)置邊框的寬度. 如矩形的邊寬, 文字的寬度. 接收實(shí)參為像素單位 mPaint.setTextSize(mDensity * 20); //設(shè)置當(dāng)繪制文字的時候的字體大小Paint設(shè)置填充樣式
setStyle (Paint.Style style)
Paint.Style.FILL 填充內(nèi)部 Paint.Style.FILL_AND_STROKE 填充并描邊 Paint.Style.STROKE 僅描邊不填充看一下效果: 因?yàn)閒ill和fill_and_stroke相似不貼出效果
文字添加陰影
setShadowLayer (float radius, float dx, float dy, int color)
參數(shù)說明:
radius: 值越大越模糊. 本質(zhì)每一個像素點(diǎn)模糊的半徑. dx: 生層的陰影水平方向移動偏移量 dy: 生層的陰影垂直方向移動偏移量 color: 生成陰影的顏色代碼實(shí)例
mPaint.setShadowLayer(mDensity*5, mDensity*15, mDensity*10, Color.RED ); canvas.drawText("陰影文字演示", 0, 25*mDensity, mPaint);給Canvas設(shè)置背景色
如果要給當(dāng)前畫布設(shè)置背景顏色,其實(shí)就是給畫布添加一個顏色圖層,**后合并的效果.有兩個方法:
canvas.drawColor(Color.BLUE); canvas.drawRGB(255, 255, 0); //這兩個功能一樣,都是用來設(shè)置背景顏色的。畫直線
drawLine (float startX, float startY, float stopX, float stopY, Paint paint)
參數(shù)說明:
startX:開始點(diǎn)X坐標(biāo) startY:開始點(diǎn)Y坐標(biāo) stopX:結(jié)束點(diǎn)X坐標(biāo) stopY:結(jié)束點(diǎn)Y坐標(biāo)代碼示例:
//方法1 單條直線 canvas.drawLine(mDensity*5, 0, mDensity*60, mDensity*20, mPaint); //方法2 多條直線 //定義一個數(shù)量為4的倍數(shù)的float類型的數(shù)組 float[] pts = {mDensity * 95,mDensity*10, mDensity*140,mDensity*10, mDensity*145,mDensity*10, mDensity*190,mDensity*10}; canvas.drawLines(pts,mPaint);效果演示:
方法2: 是根據(jù)一個點(diǎn)集合數(shù)組來畫出線,可以是多條線. **好定義為4的倍數(shù)的為數(shù)組的大小. 因?yàn)閿?shù)組的每兩個值分別對應(yīng)點(diǎn)的xy點(diǎn). 而兩個點(diǎn)才能確定一個直線. 所以一條直線的前提是4個值.
畫點(diǎn)
單個點(diǎn)
drawPoint (float x, float y, Paint paint)多個點(diǎn)
drawPoints (float[] pts, Paint paint) drawPoints (float[] pts, int offset, int count, Paint paint)代碼示例:
canvas.drawPoint(100, 100, paint); float []pts={10,10,100,100,200,200,400,400}; canvas.drawPoints(pts, 2, 4, paint);畫矩形
這里要用到Rect
或者RectF
. 這兩個都是矩形的輔助類,基本一樣. 根據(jù)四個點(diǎn)左上, 右下來確定一個矩形.
**常用的創(chuàng)建方式例如Rect rect = new Rect(10, 10, 50, 30);
參數(shù)沒有什么好說的了,要不在畫矩形的時候明確出左上,右下. 要不就傳入一個矩形輔助類對象.
代碼示例:
//畫矩形 實(shí)心 canvas.drawRect(0,0,mDensity*80, mDensity*20,mPaint); //參數(shù)12為矩形左上角的點(diǎn), 參數(shù)34為矩形右下角的點(diǎn) //矩形 空心 mPaint.setStyle(Paint.Style.STROKE); canvas.drawRect(new RectF(mDensity*100,0, mDensity*180,mDensity*20),mPaint);代碼效果:
圓角矩形
drawRoundRect (RectF rect, float rx, float ry, Paint paint)
rx: 生成圓角橢圓的X軸的半徑 ry: 生成圓角橢圓的Y軸的半徑和矩形相比只需要多指定四個角需要顯示的圓角屬性即可.
代碼示例:
//圓角矩形 實(shí)心 canvas.drawRoundRect(new RectF(0,0,mDensity*80, mDensity*20), mDensity*5, mDensity*5 ,mPaint); //參數(shù)2,3 為圓角的xy的弧度半徑 //圓角矩形 空心 mPaint.setStyle(Paint.Style.STROKE); canvas.drawRoundRect(new RectF(mDensity*100,0,mDensity*180, mDensity*20), mDensity*5, mDensity*5 ,mPaint);代碼效果:
圓形
drawCircle (float cx, float cy, float radius, Paint paint)
參數(shù)說明:
cx: 圓心x點(diǎn)坐標(biāo) cy: 圓心y點(diǎn)坐標(biāo) radius: 圓的半徑橢圓
drawOval (RectF oval, Paint paint)
橢圓是根據(jù)矩形生成的,以矩形的長為橢圓的X軸,矩形的寬為橢圓的Y軸,建立的橢圓圖形
所以只需要傳入個RectF即可, 這里不演示了.
弧
弧是橢圓的一部分,而橢圓是根據(jù)矩形來生成的,所以弧當(dāng)然也是根據(jù)矩形來生成的.
drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
參數(shù)說明:
startAngle: 起始點(diǎn),默認(rèn)為坐標(biāo)系x軸的正方向?yàn)?, 正值為順時針旋轉(zhuǎn),負(fù)值反之 sweepAngle: 從起始點(diǎn)開始需要顯示的多少角度到結(jié)束點(diǎn). 此角度正值為順時針旋轉(zhuǎn). useCenter: 是一個boolean,如果為true那么開始到圓心,和結(jié)束點(diǎn)到圓心都有連線.反之沒有.在畫弧中利用方法中的boolean,配合畫筆的填充屬性可以生成不同的圖形.
例如:
代碼示例:
//弧 有兩邊 fill實(shí)心 扇形實(shí)心 RectF rectF_ArcStart1 = new RectF(-mDensity * 20, 0, mDensity * 60, mDensity * 40); canvas.drawArc(rectF_ArcStart1,0,120,true, mPaint); //arg2:為開始角度,從x坐標(biāo)系的正方向?yàn)?度起始點(diǎn). arg3是選裝多少角度,為順時針旋轉(zhuǎn) //弧 無兩邊 實(shí)心 圓的一部分 RectF rectF_ArcStart2 = new RectF(mDensity*50,0,mDensity*130, mDensity*40); canvas.drawArc(rectF_ArcStart2,0,120,false, mPaint); //弧 無兩邊 空心 弧邊 mPaint.setStyle(Paint.Style.STROKE); RectF rectF_ArcEnd1 = new RectF(mDensity*120,0,mDensity*200, mDensity*40); canvas.drawArc(rectF_ArcEnd1,0,120,false, mPaint); //弧 有兩邊 空心 扇形邊框 mPaint.setStyle(Paint.Style.STROKE); RectF rectF_ArcEnd2 = new RectF(mDensity*190,0,mDensity*260, mDensity*40); canvas.drawArc(rectF_ArcEnd2,0,120,true, mPaint);二.Path和DrawTetx練習(xí)
canvas對象
不光可以直接畫出指定的矩形,還可以**自定義的Path路徑繪制出圖形. 比如手勢繪畫,不規(guī)則軌跡等等.
canvas.drawPath(Path path, Paint paint)
Path直線
繪制直線路徑,只需要找到一個起始點(diǎn),然后不停的話直線的就可以, 每次畫直線的起始點(diǎn)都是上一次的結(jié)束點(diǎn).
常用的函數(shù):
moveTo(float x, float y): 直接把下一次的起始點(diǎn)移動到某一個位置 lineTo(float x, float y): 從上一次的起始點(diǎn)到指定的點(diǎn)畫出連接點(diǎn), 可以一直調(diào)用 close: 如果**后Path的路徑的**終點(diǎn)沒有和起始點(diǎn)重合,那么調(diào)用close()就可以連接起點(diǎn)和終點(diǎn),形成閉合代碼示例:
Path path = new Path(); path.moveTo(10*mDensity, 10*mDensity); //設(shè)定起始點(diǎn) path.lineTo(10*mDensity, 100*mDensity); //**條直線的終點(diǎn),也是第二條直線的起點(diǎn) path.lineTo(200*mDensity,100*mDensity); //畫第二條直線 path.close();//閉環(huán) canvas.drawPath(path, mPaint);代碼圖示:
可以看到我們可以規(guī)劃任意一條路徑,然后調(diào)用drawPath一次性畫出. 上面我們只調(diào)用了兩次lineTo()
方法,意思為兩條線,但是效果有三條線,這就是close()閉合
的意思,收尾相連.
Path矩形
當(dāng)利用Path路徑要畫出一個圖形的時候, 這里會有多出一個順序的概念,如順時針開始,或者逆時針開始.
addRect (float left, float top, float right, float bottom, Path.Direction dir)
addRect (RectF rect, Path.Direction dir)
這里給Path添加路徑和直接利用canvas.drawRect()
差不多,不過這里有一個Path.Direction參數(shù)
,表示構(gòu)建的矩形以什么順序畫出
Path.Direction.CCW:是counter-clockwise縮寫,指創(chuàng)建逆時針方向的矩形路徑 Path.Direction.CW:是clockwise的縮寫,指創(chuàng)建順時針方向的矩形路徑 這樣直接畫出可能不好理解, 我們可以結(jié)合文字根據(jù)路徑畫出來查看效果
先看一下結(jié)果:
這樣就很明顯的看出區(qū)別了,下面貼出實(shí)現(xiàn)代碼
//逆向生成矩形 Path CCWRectpath = new Path(); RectF rect1 = new RectF(30*mDensity, 10*mDensity, 110*mDensity, 60*mDensity); CCWRectpath.addRect(rect1, Path.Direction.CCW); //順向生成生成 Path CWRectpath = new Path(); RectF rect2 = new RectF(130*mDensity, 10*mDensity, 210*mDensity, 60*mDensity); CWRectpath.addRect(rect2, Path.Direction.CW); //先畫出這兩個路徑 canvas.drawPath(CCWRectpath, mPaint); canvas.drawPath(CWRectpath, mPaint); mPaint.setStyle(Paint.Style.FILL); mPaint.setTextSize(10*mDensity); //根據(jù)路徑順序畫出文字, 參數(shù)2為路徑, 參數(shù)3:每一邊的頭文字從原點(diǎn)的偏移量,相對于文字的左邊開始為整數(shù). 參數(shù)4: 每一行文字與所在路徑的y軸偏移量,可以理解為值越大越遠(yuǎn). canvas.drawTextOnPath("啥時候能漲工資呢,好無聊啊好無聊",CCWRectpath,0,10*mDensity,mPaint); canvas.drawTextOnPath("啥時候能漲工資呢,好無聊啊好無聊",CWRectpath,0,0*mDensity,mPaint);可以看到前半部分根據(jù)路徑繪制了矩形,但是這樣我們不能看出任何效果, 所以使用了canvas.drawTextOnPath()函數(shù),與之前用的drawText()其實(shí)差不多,參數(shù)2就是根據(jù)傳入的path對象的path路徑來以此繪制文字, 參數(shù)3,4,其實(shí)是偏移量. 參數(shù)3代表與路徑的起始點(diǎn)多少距離開始,我們可以想想每個段落是不是都有空格.就是這個意思. 參數(shù)4是與路徑的距離(上下偏移),比如高考作文都是畫好了橫線讓我們在上面寫字.當(dāng)傳入0的時候就壓著線寫,傳入10,就是往上移動10,距離線10的位置.
Path圓角矩形
還記得canvas也可以直接drawRoundRect(), 其實(shí)canvas那幾個在path都有,并且還增加了貝塞爾曲線等.
Path圓角矩形可以更靈活, 利用canvas畫出的四個圓角是相等的,當(dāng)時我們利用path添加圓角矩形卻可以分別制定圓角的范圍.
addRoundRect(RectF rect, float rx, float ry, Direction dir)
addRoundRect(RectF rect, float[] radii, Direction dir)
直接看圖:
看到后面那個圖片,每個角都不一樣.
代碼實(shí)現(xiàn):
Path pathRoundRect = new Path(); RectF rectRoundCCW = new RectF(20*mDensity, 25*mDensity, 120*mDensity, 80*mDensity); pathRoundRect.addRoundRect(rectRoundCCW, 5*mDensity, 15*mDensity , Path.Direction.CCW); //arg2,3: 為生成橢圓的橫軸和豎軸半徑 RectF rectRoundCW = new RectF(140*mDensity,25*mDensity, 240*mDensity, 80*mDensity); float radii[] ={2*mDensity,3*mDensity, 10*mDensity,10*mDensity, 2*mDensity,3*mDensity, 25*mDensity,25*mDensity}; //必須為8個值, 對應(yīng)四個角, 倆倆一堆為xy. pathRoundRect.addRoundRect(rectRoundCW, radii, Path.Direction.CCW); canvas.drawPath(pathRoundRect, mPaint);我們可以直接調(diào)用制定四個形參的函數(shù)直接規(guī)定四個圓角都相等的方法. 也可以調(diào)用三個參數(shù)的函數(shù),這個函數(shù)中第二個接收一個數(shù)組, 這個數(shù)組必須為8個,少于8個就會出現(xiàn)角標(biāo)越界異常. 因?yàn)檫@個函數(shù)是需要制定四個圓角. 每個角包含兩個點(diǎn), 所以**起碼需要8個才可能滿足此函數(shù).
其他Path圖形
其實(shí)和canvas對應(yīng)的drawXXX差不多, 就不一一說明
圓形: addCircle (float x, float y, float radius, Path.Direction dir) 橢圓: addOval (RectF oval, Path.Direction dir) 弧形: addArc (RectF oval, float startAngle, float sweepAngle) 賽貝爾: quadTo (float x1, float y1, float x2, float y2) 后面會詳細(xì)講解
Paint關(guān)于文字屬性的設(shè)置
我們經(jīng)常用的畫筆屬性寫字可以認(rèn)為基礎(chǔ)屬性,然后還有一些加粗下劃線傾斜認(rèn)為樣式屬性
普通屬性
setStrokeWidth(10) //畫筆寬度 setAntiAlias(true) //是否開啟抗鋸齒 setTextSize(20) //設(shè)置文字大小 setStyle(Paint.Style.FILL) //設(shè)置填充樣式 setTextAlign(Align.CENTER) //設(shè)置文字對齊方式 默認(rèn)為Left對齊起始 樣式屬性 setFakeBoldText(true) //設(shè)置為粗體 setUnderlineText(true) //設(shè)置下劃線 setTextSkewX(0.5f) //設(shè)置傾斜率 負(fù)值為向右,正值向左 setStrikeThruText(true) //設(shè)置刪除線 setTextScaleX(2) //水平拉伸
直接貼上效果
文字對應(yīng)canvas繪制方式
1.普通繪制
drawText (String text, float x, float y, Paint paint) drawText (CharSequence text, int start, int end, float x, float y, Paint paint) drawText (String text, int start, int end, float x, float y, Paint paint) drawText (char[] text, int index, int count, float x, float y, Paint paint)我們常用的就是**個, 3 4個為截取某一部分顯示,不常用.
而第二個接收CharSequence,這個對象比較強(qiáng)大因?yàn)樗粌H可以寫字符還能添加bitmap.但是在canvas中貌似不支持charSequence. 所以此函數(shù)也就失去了意義.
2.指定位置繪制
drawPosText (char[] text, int index, int count, float[] pos, Paint paint) drawPosText (String text, float[] pos, Paint paint)我們直接以第二個構(gòu)造函數(shù)說明. 這個函數(shù)是根據(jù)你指定的數(shù)組float的點(diǎn),來以此繪制出文字. 所以到這我們使用時候要注意要繪制的字符串長度要和設(shè)定的數(shù)組長度為1:2的比例.否則可能會出錯.
代碼示例:
float []pos=new float[]{20*mDensity,25*mDensity, 20*mDensity,50*mDensity, 20*mDensity,75*mDensity, 20*mDensity,100*mDensity}; //注意這里的數(shù)組,倆倆一對, 對數(shù)要等于drawPostText的字符串長度,否則會出現(xiàn)越界異常 canvas.drawPosText("八榮八恥", pos, mPaint);//兩個構(gòu)造函數(shù)圖片示例:
3.根據(jù)路徑繪制文字
在上面繪制的時候已經(jīng)說過了,這里再用圓來演示一遍
關(guān)鍵代碼:
canvas.drawTextOnPath("只要想努力,永遠(yuǎn)都不會晚.", circlePath, 45*mDensity, 0, mPaint); //第二個路徑,改變hoffset、voffset參數(shù)值 ,參數(shù)3偏移路徑起始點(diǎn)的距離, 參數(shù)4效果向外擴(kuò)張的效果 canvas.drawTextOnPath("只要想努力,永遠(yuǎn)都不會晚.", circlePath2, 20*mDensity, 8*mDensity, mPaint);代碼圖示:
字體的TypeFace Typeface是專門用來設(shè)置字體樣式的,**paint.setTypeface()來指定??梢灾付ㄏ到y(tǒng)中的字體樣式,也可以指定自定義的樣式文件中獲取。要構(gòu)建Typeface時,可以指定所用樣式的正常體、斜體、粗體等,如果指定樣式中,沒有相關(guān)文字的樣式就會用系統(tǒng)默認(rèn)的樣式來顯示,一般默認(rèn)是宋體。
typeface的構(gòu)建方法
create(String familyName, int style) //直接**指定字體名來加載系統(tǒng)中自帶的文字樣式 create(Typeface family, int style) //**其它Typeface變量來構(gòu)建文字樣式 createFromAsset(AssetManager mgr, String path) //**從Asset中獲取外部字體來顯示字體樣式 createFromFile(String path)//直接從路徑創(chuàng)建 createFromFile(File path)//從外部路徑來創(chuàng)建字體樣式 defaultFromStyle(int style)//創(chuàng)建默認(rèn)字體 我們?nèi)绻肟焖賱?chuàng)建一個TypeFace對象那么就使用默認(rèn)方法defaultFromStyle()其中的style有四個屬性: Typeface.RMAL //正常體 Typeface.BOLD //粗體 Typeface.ITALIC //斜體 Typeface.BOLD_ITALIC //粗斜體 設(shè)置字體傳入familyName字符串無論是宋體,還是楷體.都無效果…. = =|||自定義字體
把ttf的后綴的字體包放入到項(xiàng)目的…/app/src/main/assets/Fonts下, 如果沒有Fonts文件夾手動創(chuàng)建.
然后代碼如下:
//設(shè)置自定義的字體 Typeface myTypeFace = Typeface.createFromAsset(getContext().getAssets(), "Fonts/jian_luobo.ttf"); mPaint.setTypeface(myTypeFace); canvas.drawText("你妹我看你好不好使!!!",10,50*mDensity, mPaint);代碼圖例:
源碼**: 查找SuGraphicsBaseCanvasPaintActivity類, 手機(jī)查看效果一級界面進(jìn)入選擇graphics模塊
相關(guān)推薦:
熱門課程
機(jī)構(gòu)資訊
- 太倉java開發(fā)培訓(xùn)費(fèi)用_太倉JAVA培訓(xùn)
- 昆山哪里有Java實(shí)戰(zhàn)培訓(xùn)學(xué)校_昆山JAVA培訓(xùn)
- 常熟學(xué)Java哪個好_常熟JAVA培訓(xùn)
- 蘇州Java培訓(xùn)課程哪個好_蘇州JAVA培訓(xùn)
- 昆山哪里有Java語言培訓(xùn)學(xué)院_昆山JAVA培訓(xùn)
- 昆山Java工程師培訓(xùn)機(jī)構(gòu)哪個好_昆山JAVA培訓(xùn)
- 常熟學(xué)習(xí)Java工程師哪里好_常熟JAVA培訓(xùn)
- 昆山Java編程課程價格_昆山JAVA培訓(xùn)
- 張家港Java開發(fā)培訓(xùn)班學(xué)費(fèi)_張家港JAVA培訓(xùn)
- 太倉Java工程師培訓(xùn)學(xué)院哪里好_太倉JAVA培訓(xùn)