生活中我們要畫一幅圖片韭邓,需要工具丛忆,一個畫筆??,一個畫板(或是紙張)仍秤,然后想要豐富多彩一點,我們還需要涂色可很。
Android畫圖--同樣有三個基本對象:Color诗力,Paint,Canvas
它們都位于android.graphics畫圖包下面我抠。
- Color: 顏色對象苇本,相當于現(xiàn)實生活中的 調(diào)料
- Paint : 畫筆對象,相當于現(xiàn)實生活中畫圖用的 筆菜拓。對畫筆的一些參數(shù)設(shè)置是很重要的瓣窄。
- Canvas : 畫布對象,相當于現(xiàn)實生活中畫圖用的畫紙或者畫布
三者結(jié)合纳鼎,便能畫出基本圖形
一俺夕、Canvas
關(guān)于Canvas的獲取方式有三種:
-
第一種:在View的OnDraw方法中裳凸,回調(diào)方法OnDraw會將Canvas做為參數(shù)傳入,方法中直接使用即可劝贸。對于這方法姨谷,view在繪制之后onDraw 方法不會被反復(fù)調(diào)用,需要我們調(diào)用View的invalidate方法來觸發(fā)相應(yīng)view的onDraw方法再次被調(diào)用映九。這種方式是最常用的梦湘。
-
第二種:使用專門的SurfaceView的canvas來畫圖。這種方式最大的區(qū)別就是SurfaceView中定義了一個專門的線程來完成畫圖工作件甥,應(yīng)用程序不需要等待View的刷圖捌议,提高性能。這種方法主要用在游戲引有,高品質(zhì)動畫方面的畫圖瓣颅。SurfaceView中使用SurfaceHolder.lockCanvas()來獲取Canvas。
-
第三種:自己創(chuàng)建canvas來使用轿曙。
Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
需要注意的是弄捕,如果使用自定義的Canvas,我們最后依然需要通過調(diào)用系統(tǒng)提供的Canvas的Canvas.drawBitmap(Bitmap,...)方法导帝,將canvas最終繪制出來守谓。
------------------------------------------------------------
關(guān)于Canvas的使用
1.繪制點
void drawPoint(float x, float y, Paint paint)
畫點,參數(shù)一水平x軸您单,參數(shù)二垂直y軸斋荞,第三個參數(shù)為Paint對象。
void drawPoints (float[] pts, Paint paint)
繪制一組點虐秦,坐標位置由float數(shù)組指定
2.繪制直線
void drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
畫線平酿,參數(shù)一起始點的x軸位置,參數(shù)二起始點的y軸位置悦陋,參數(shù)三終點的x軸水平位置蜈彼,參數(shù)四y軸垂直位置,最后一個參數(shù)為Paint對象俺驶。
void drawLines (float[] pts, Paint paint)
繪制一組線 幸逆,坐標位置由float數(shù)組指定
3.繪制矩形
void drawRect (float left, float top, float right,float bottom, Paint paint)
繪制矩形,四個數(shù)值(矩形左上角和右下角兩個點的坐標)來確定一個矩形
void drawRect(Rect r, Paint paint)
繪制矩形暮现,參數(shù)一為Rect一個區(qū)域
void drawRect (RectF rect,Paint paint)
繪制矩形还绘,參數(shù)一為RectF 一個區(qū)域
對于第二、三種方式栖袋,我們需要傳入一個Rect或RectF
Rect rect = new Rect(100,100,800,400);
canvas.drawRect(rect,mPaint);
RectF rectF = new RectF(100.1f,100.1f,800.1f,400.1f);
canvas.drawRect(rectF,mPaint);
這兩者的主要區(qū)別是:精度不一樣拍顷。Rect是使用int類型作為數(shù)值,RectF是使用float類型作為數(shù)值
4.繪制圓形矩形
void drawRoundRect(@NonNull RectF rect, float r1, float r2, @NonNull Paint paint)
繪制圓角矩形塘幅,rx, ry分別是圓弧的圓心 和 半徑昔案,其中圓心用于確定位置尿贫,而半徑用于確定大小
void drawRoundRect (float left,float top, float right, float bottom, float r1, float r2, Paint paint)
API level 21才添加的
5.繪制橢圓
void drawOval(@NonNull RectF oval, @NonNull Paint paint)
繪制橢圓
drawOval(float left, float top, float right, float bottom, Paint paint)
6.繪制圓
drawCircle(float cx, float cy, float radius, @NonNull Paint paint)
繪制圓,cx爱沟,cy是圓心坐標帅霜,radius是半徑,paint是畫筆對象
7.繪制路徑
void drawPath(Path path, Paint paint)
繪制一個路徑呼伸,參數(shù)一為Path路徑對象
8.繪制圖片
void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)
參數(shù)一就是我們常規(guī)的Bitmap對象身冀,參數(shù)二是源區(qū)域(這里是bitmap),參數(shù)三是目標區(qū)域(應(yīng)該在 canvas的位置和大小)括享,參數(shù)四是Paint畫刷對象搂根,因為用到了縮放和拉伸的可能,當原始Rect不等于目標Rect時性能將會有大幅損失铃辖。
9.繪制文本
void drawText(String text, float x, float y, Paint paint)
繪制文本剩愧,Canvas類除了上面的還可以描繪文字,參數(shù)一是String類型的文本娇斩,參數(shù)二x軸仁卷,參數(shù)三y軸,參數(shù)四是Paint對象犬第。
void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint)
在路徑上繪制文本锦积,相對于上面第二個參數(shù)是Path路徑對象
10.繪制弧形
void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter,@NonNull Paint paint)
繪制弧形、扇形
11.畫布的變化
void translate(float dx, float dy)
位移
void scale(float sx, float sy, float px, float py)
縮放
void rotate(float degrees)
旋轉(zhuǎn),默認旋轉(zhuǎn)中心為原點
void rotate(float degrees, float px, float py)
第一個參數(shù)是旋轉(zhuǎn)角度歉嗓,后兩個參數(shù)依舊是控制旋轉(zhuǎn)中心點
二丰介、Paint
void setARGB(int a, int r, int g, int b)
設(shè)置Paint對象顏色,參數(shù)一為alpha透明通道
void setAlpha(int a)
設(shè)置alpha不透明度鉴分,范圍為0~255
void setAntiAlias(boolean aa)
是否抗鋸齒
void setColor(int color)
設(shè)置顏色哮幢,這里Android內(nèi)部定義的有Color類包含了一些常見顏色定義
void setStyle(Style style)
設(shè)置畫筆樣式為描邊,畫筆樣式分三種:
1.Paint.Style.STROKE:描邊
2.Paint.Style.FILL_AND_STROKE:描邊并填充
3.Paint.Style.FILL:填充
void setFakeBoldText(boolean fakeBoldText)
設(shè)置偽粗體文本
void setLinearText(boolean linearText)
設(shè)置線性文本
void setTextAlign(Paint.Align align)
設(shè)置文本對齊
void setTextScaleX(float scaleX)
設(shè)置文本縮放倍數(shù),1.0f為原始
void setTextSize(float textSize)
設(shè)置字體大小
void setUnderlineText(boolean underlineText)
設(shè)置下劃線
setXfermode(Xfermode xfermode)
設(shè)置圖像混合模式
關(guān)于這個方法可以看這個鏈接了解
http://www.cnblogs.com/tianzhijiexian/p/4297172.html
Rasterizer setRasterizer(Rasterizer rasterizer)
設(shè)置光柵化志珍,實際效果并不明顯
Typeface setTypeface(Typeface typeface)
設(shè)置字體橙垢,Typeface包含了字體的類型,粗細伦糯,還有傾斜钢悲、顏色等。
Typeface字體對象舔株,這個類的作用是獲取字體,創(chuàng)建字體还棱,以及設(shè)置字體载慈。
PathEffect setPathEffect(PathEffect effect)
設(shè)置路徑效果
Shader setShader(Shader shader)
設(shè)置陰影
上面是畫筆的基本方法,我們仔細看會發(fā)現(xiàn)幾個獨特的類和Paint配合使用珍手,達到更好的效果
1.Shader:在使用paint設(shè)置畫筆的同時办铡,我們也可以給畫筆來設(shè)置shader對象來為畫筆增加更多的效果辞做。Shader類專門用來渲染圖像以及一些幾何圖形,Shader下面包括幾個直接子類寡具,分別是:
Shader類的使用秤茅,都需要先構(gòu)建Shader對象,然后通過Paint的setShader方法設(shè)置渲染對象童叠,然后設(shè)置渲染對象框喳,然后再繪制時使用這個Paint對象即可。
BitmapShader : 圖像渲染
LinearGradient : 線性漸變
RadialGradient : 環(huán)形漸變
SweepGradient : 掃描漸變---圍繞一個中心點掃描漸變就像電影里那種雷達掃描
ComposeShader : 組合渲染
2.Typeface:一個字體的輔助類厦坛。一般情況下五垮,我們就是使用字體文件創(chuàng)建一個Typeface,然后使用Typeface
//Default Font
Typeface mType = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD);
mPaint.setTypeface(mType);
// Custom Font : /assets/fonts/abc.ttf
Typeface mType = Typeface.createFromAsset(getContext().getAssets(),"fonts/aaa.ttf");
mPaint.setTypeface(mType);
//Custom Font : /sdcard/abc.ttf
Typeface mType = Typeface.createFromFile("sdcard/abc.ttf");
mPaint.setTypeface(mType);
3.PathEffect:會按照指定的路徑繪制圖形杜秸,完成一些特殊的效果放仗。
使用PathEffect pe = new 一個具體的子類;
然后paint.setPathEffect( pe);即可
具體的子類如下:
CornerPathEffect:
這個類的作用就是將Path的各個連接線段之間的夾角用一種更平滑的方式連接撬碟,類似于圓弧與切線的效果诞挨。
一般的,通過CornerPathEffect(float radius)指定一個具體的圓弧半徑來實例化一個CornerPathEffect呢蛤。DashPathEffect:
這個類的作用就是將Path的線段虛線化惶傻。
構(gòu)造函數(shù)為DashPathEffect(float[] intervals, float offset),其中intervals為虛線的ON和OFF數(shù)組顾稀,該數(shù)組的length必須大于等于2达罗,phase為繪制時的偏移量。DiscretePathEffect:
這個類的作用是打散Path的線段静秆,使得在原來路徑的基礎(chǔ)上發(fā)生打散效果粮揉。
一般的,通過構(gòu)造DiscretePathEffect(float segmentLength,float deviation)來構(gòu)造一個實例抚笔,其中扶认,segmentLength指定最大的段長,deviation指定偏離量殊橙。PathDashPathEffect:
這個類的作用是使用Path圖形來填充當前的路徑辐宾,其構(gòu)造函數(shù)為PathDashPathEffect (Path shape, float advance, float phase,PathDashPathEffect.Stylestyle)。
shape則是指填充圖形膨蛮,advance指每個圖形間的間距叠纹,phase為繪制時的偏移量,style為該類自由的枚舉值敞葛,有三種情況:Style.ROTATE誉察、Style.MORPH和
Style.TRANSLATE。其中ROTATE的情況下惹谐,線段連接處的圖形轉(zhuǎn)換以旋轉(zhuǎn)到與下一段移動方向相一致的角度進行轉(zhuǎn)轉(zhuǎn)持偏,MORPH時圖形會以發(fā)生拉伸或壓縮等變形的情況與下一段相連接驼卖,TRANSLATE時,圖形會以位置平移的方式與下一段相連接鸿秆。ComposePathEffect:
組合效果酌畜,這個類需要兩個PathEffect參數(shù)來構(gòu)造一個實例,ComposePathEffect (PathEffect outerpe,PathEffect innerpe)卿叽,表現(xiàn)時桥胞,會首先將innerpe表現(xiàn)出來,然后再在innerpe的基礎(chǔ)上去增加outerpe的效果附帽。
SumPathEffect:
疊加效果埠戳,這個類也需要兩個PathEffect作為參數(shù)SumPathEffect(PathEffect first,PathEffect second),但與ComposePathEffect不同的是蕉扮,在表現(xiàn)時整胃,會分別對兩個參數(shù)的效果各自獨立進行表現(xiàn),然后將兩個效果簡單的重疊在一起顯示出來喳钟。
關(guān)于參數(shù)phase
在存在phase參數(shù)的兩個類里屁使,如果phase參數(shù)的值不停發(fā)生改變淘钟,那么所繪制的圖形也會隨著偏移量而不斷的發(fā)生變動炭庙,這個時候,看起來這條線就像動起來了一樣驮吱。
WechatIMG313.jpeg
三易茬、Color
1.系統(tǒng)顏色
可以通過 Color.顏色名酬蹋,來獲取顏色,應(yīng)為是靜態(tài)的抽莱,返回一個整數(shù)值
有以下幾個: BLACK(黑色),BLUE(藍色),CYAN(青色),GRAY(灰色),GREEN(綠色),RED(紅色),WRITE(白色),YELLOW(黃色)等
Button btn = (Button) findViewById(R.id.btn);
btn.setBackgroundColor(Color.BLUE);
2.在XML中自定義顏色
<!--?xml version=1.0 encoding=utf-8?-->
<resources>
<color name="mycolor">#748751</color>
</resources>
//在java代碼中的使用
int mycolor = getResources().getColor(R.color.mycolor);
Button btn = (Button) findViewById(R.id.btn);
btn.setBackgroundColor(mycolor);
3.在java代碼中自定義顏色
//若已知顏色
int mycolor = 0xff123456;0x代表16進制FF代表透明度
//或調(diào)用靜態(tài)的 argb方法范抓,可以調(diào)出個性的顏色
int myColor=Color.argb(0xff, 255, 255, 255)
argb()方法的參數(shù)依次為透明度。后三個為紅,綠,藍的大小食铐。范圍都是[0-255]匕垫,0至255 顏色依次加深