一、Canvas類android.graphics.Canvas
Canvas類好比手機(jī)中的畫紙适揉,我們可以在Canvas上畫圖形或者圖像诸迟。一般我們用android來繪畫的時(shí)候撕阎,需要四個(gè)組成部分:
1热押、位圖:包含像素
2准浴、Canvas畫板:包含繪畫內(nèi)容事扭,寫入位圖
3、初始圖形:如Rect乐横、Bitmap求橄、text等
4、Paint:用來描述上面初始圖形的顏色和類型等
Canvas類提供了三個(gè)構(gòu)造方法:
Public Canvas()葡公;構(gòu)造一個(gè)默認(rèn)無參的Canvas對(duì)象
Public Canvas(Bitmap bitmap)罐农;根據(jù)一個(gè)Bitmap構(gòu)造一個(gè)Canvas對(duì)象
Public Canvas(GL gl);根據(jù)一個(gè)GL來構(gòu)造一個(gè)對(duì)象
下面我們來了解一下Canvas類提供的方法:
在Canvas類提供的方法中比較多經(jīng)常用的是以draw開頭的方法催什,draw開頭的方法很容易理解就是向畫板中畫圖形涵亏,比如可以向Canvas中畫位圖,給圖形填充顏色等蒲凶。
二气筋、Paint類android.graphics.Paint
Paint類包含有用來畫幾何圖形、文本豹爹、位圖的類型和顏色等信息裆悄,如果把Canvas類看作是畫板,那我們可以把Paint類看做是畫筆臂聋,可以根據(jù)需要畫出不同顏色和樣式的圖形光稼、文本等內(nèi)容。
Paint類有三個(gè)構(gòu)造方法:
Public Paint()構(gòu)造一個(gè)缺省的Paint對(duì)象
Public?Paint(int flags);根據(jù)指定的flags來構(gòu)造一個(gè)Paint對(duì)象孩等,創(chuàng)建之后可以用
setFlags()方法來更改
Public Paint(Paint paint)根據(jù)指定的paint對(duì)象來構(gòu)造一個(gè)Paint對(duì)象
Paint類提供了很多方法來設(shè)置和獲取Paint對(duì)象的屬性艾君,比如:
public int getColor ()獲得Paint對(duì)象的顏色值
public ColorFilter getColorFilter ()獲得顏色過濾器
public float getTextSize ()獲得字體大小數(shù)值
public void setStyle (Paint.Style style)設(shè)置paint的類型
三Color類android.graphics.Color
此類 定義了一些方法來創(chuàng)建和轉(zhuǎn)換顏色值。顏色被表示為封裝的數(shù)值肄方,這個(gè)數(shù)值由四個(gè)字節(jié)組成冰垄,分別是:alpha、red权她、green虹茶、blue,這些值是非自 左乘的隅要,也就是說任何透明性只存儲(chǔ)在alpha部分蝴罪,而不是在顏色組成部分。每一部分按照如下的順序保存:(alpha<<24)| (red<<16)|
Color類提供了12個(gè)常量值來代表不同的顏色值步清,我們?cè)陂_發(fā)工程中可以直接調(diào)用這些常量值來設(shè)置我們所要修飾的文本要门、圖形等對(duì)象虏肾。
Color類提供了一個(gè)無參的構(gòu)造方法Color()
Color類提供了一些方法來進(jìn)行顏色值的創(chuàng)建和轉(zhuǎn)換如下:
其中三個(gè)方法是用來返回一個(gè)顏色常量值的紅綠藍(lán)分色,數(shù)值分別在0-255之間欢搜,如下:
Public static red(int color);
Public static green(int color);
Public static blue(int color);
其中Public static int rgb(int red,int green,int blue);輸入紅綠藍(lán)三色封豪,返回一個(gè)RGB顏色值。
下面幾個(gè)方法大家可以參考Android API來了解:
Public static int HSVToColor(int alpha,float[] hsv);
Public static int HSVToColor(float[] hsv);
Public static void RGBToHSV(int red,int green,int blue,float[] hsv);
Public static int alpha(int color);
Public static int argb(int alpha,int red,int green,int blue);
Public static colorToHSV(int color,float[] hsv);
Public static parseColor(String colorString);
四.Typeface類android.graphics.Typeface
Typeface類定義字體和字體內(nèi)在的類型炒瘟。這個(gè)類被用在畫筆Paint設(shè)置的時(shí)候吹埠,比如用textSize,textSkewX和textScale設(shè)置來指定text在畫的時(shí)候如何來顯示和測(cè)量。
Typeface 提供了一些常量值來表示自身的一些屬性唧领,比如BOLD藻雌,BOLD_ITALIC,ITALIC等斩个,開發(fā)者可以用 defaultFrOPhone SDNtyle(int style)獲得內(nèi)在的Typeface對(duì)象胯杭。讀者可以參考詳細(xì)的API文檔再這里就不再贅述了。
下面我們來看一下Typeface的主要方法受啥。
Typeface類沒有構(gòu)造方法做个,通常如果一個(gè)類沒有構(gòu)造函數(shù)就無法通過構(gòu)造來生成一個(gè)對(duì)象實(shí)體,此時(shí)一般會(huì)有特定的靜態(tài)方法來取得這個(gè)類的實(shí)體滚局。Typeface就提供了四個(gè)靜態(tài)方法間接來得到Typeface實(shí)體分別如下:
Public static Typeface create(Typeface family居暖,int style);
此方法返回一個(gè)與已經(jīng)存在的Typeface字形體系相匹配且類型是指定類型的Typeface藤肢。如果你想得到一個(gè)與已經(jīng)存在的Typeface字形體系 相類似太闺,但是樣式不一樣的Typeface時(shí)可以調(diào)用此方法。其中family參數(shù)可以為null嘁圈,如果為空則表示從默認(rèn)的Typeface字形體系中選 擇省骂。
Public static Typefaxe create(String familyname,int style);
此方法通過給定的字形體系的名稱familyname和指定的類型返回一個(gè)Typeface對(duì)象。如果給定字形體系的名稱為null最住,我們可以通過getStyle()方法來獲得返回Typeface對(duì)象的真正的屬性钞澳。
Public static Typeface createFromAsset(AssetManager mgr,String path);
此方法通過規(guī)定的字體數(shù)據(jù)來返回一個(gè)Typeface對(duì)象。第一個(gè)參數(shù)為資源管理器涨缚,第二個(gè)參數(shù)是指定字體類型轧粟。
Public static Typeface defaultFrOPhone SDNtyle(int style);此方法返回一個(gè)指定類型的Typeface對(duì)象
Typeface還提供了另外三個(gè)方法:
Public int getStyle();此方法返回Typeface內(nèi)在的類型屬性
Public final Boolean isBold();如果getStyle()有BOLD位組將返回true
Public final Boolean isItalic();如果getStyle()有ITALIC位組將返回true
五、Path類android.graphics.Path
Path類(一組區(qū)域)的描畫脓魏,類囊括多種幾何圖形比如直線線段兰吟、二次曲線、三次曲線等茂翔,
調(diào)用Canvas.drawPath()方法可以將Path以所定義的paint的方式來畫到畫板上或者填出圖形揽祥,也可以用paint所指定方式來畫圖形。
六檩电、RectF類android.graphics.RectF和Rect類android.graphics.Rect
RectF 這個(gè)類包含一個(gè)矩形的四個(gè)單精度浮點(diǎn)坐標(biāo)。矩形通過上下左右4個(gè)邊的坐標(biāo)來表示一個(gè)矩形。這些坐標(biāo)值屬性可以被直接訪問俐末,用width()和 height()方法可以獲取矩形的寬和高料按。注意:大多數(shù)方法不會(huì)檢查這些坐標(biāo)分類是否錯(cuò)誤(也就是left<=right和top& lt;=bottom).
RectF一共有四個(gè)構(gòu)造方法:
RectF()構(gòu)造一個(gè)無參的矩形
RectF(float left,float top,float right,float bottom)構(gòu)造一個(gè)指定了4個(gè)參數(shù)的矩形
RectF(Rect F r)根據(jù)指定的RectF對(duì)象來構(gòu)造一個(gè)RectF對(duì)象(對(duì)象的左邊坐標(biāo)不變)
RectF(Rect r)根據(jù)給定的Rect對(duì)象來構(gòu)造一個(gè)RectF對(duì)象
RectF提供了很多方法,下面介紹幾個(gè)方法:
Public Boolean contain(RectF r);判斷一個(gè)矩形是否在此矩形內(nèi)卓箫,如果在這個(gè)矩形內(nèi)或者和這個(gè)矩形等價(jià)則返回true载矿,同樣類似的方法還有public Boolean contain(float left,float top,float right,float bottom)和public Boolean contain(float x,float y)。
Public void union(float x,float y)更新這個(gè)矩形烹卒,使它包含矩形自己和(x闷盔,y)這個(gè)點(diǎn)。
RectF類提供的方法都比較簡(jiǎn)單旅急,容易理解逢勾,再此就不再一一贅述
Android.graphics.Rect類,這個(gè)類同android.graphics.RectF很相似藐吮,不同的地方是Rect類的坐標(biāo)是用整形表示的溺拱,而RectF的坐標(biāo)是用單精度浮點(diǎn)型表示的。這里大家一定要注意 啊谣辞。
七迫摔、Point類android.graphics.Point
這個(gè)類從字面意思就可以看出它跟點(diǎn)有關(guān)系,是點(diǎn)的一個(gè)對(duì)象類泥从。
這個(gè)類有兩個(gè)屬性句占,分別是:X坐標(biāo)和y坐標(biāo)。
構(gòu)造函數(shù)有三個(gè):Point()躯嫉,Point(int x纱烘,int y),Point(Point p)
主要方法有:
Public void set(x和敬,y)凹炸;重新設(shè)定一下x,y的坐標(biāo)
Public final void offset(int dx,int dy);給坐標(biāo)一個(gè)補(bǔ)償值昼弟,值可以使正的也可以是負(fù)的啤它。
Public final void negate();否定坐標(biāo)值。
Point類和android.graphics.PointF類似舱痘,不同點(diǎn)是前者坐標(biāo)值的類型是int型变骡,而后者的坐標(biāo)值是float型。除此之外PointF類多加了幾個(gè)方法芭逝,比如:
Public final float length();返回(0塌碌,0)點(diǎn)到該點(diǎn)的距離。
Public static float length(float x,float y);返回(0旬盯,0)點(diǎn)到(x台妆,y)點(diǎn)的距離翎猛。
canvas.save();和canvas.restore();是兩個(gè)相互匹配出現(xiàn)的,作用是用來保存畫布的狀態(tài)和取出保存的狀態(tài)的接剩。這里稍微解釋一下切厘,
當(dāng)我們對(duì)畫布進(jìn)行旋轉(zhuǎn),縮放懊缺,平移等操作的時(shí)候其實(shí)我們是想對(duì)特定的元素進(jìn)行操作疫稿,比如圖片,一個(gè)矩形等鹃两,但是當(dāng)你用canvas的方法來進(jìn)行這些操作的時(shí)候遗座,其實(shí)是對(duì)整個(gè)畫布進(jìn)行了操作,那么之后在畫布上的元素都會(huì)受到影響俊扳,所以我們?cè)诓僮髦罢{(diào)用canvas.save()來保存畫布當(dāng)前的狀態(tài)途蒋,當(dāng)操作之后取出之前保存過的狀態(tài),這樣就不會(huì)對(duì)其他的元素進(jìn)行影響拣度。
畫布旋轉(zhuǎn)后的左邊中心點(diǎn)會(huì)變碎绎。
publicRectF(floatleft,floattop,floatright,floatbottom) 參數(shù)為坐標(biāo)點(diǎn),可簡(jiǎn)單理解為 左上點(diǎn)與右下點(diǎn) 構(gòu)成的一個(gè)矩形
通過設(shè)置開始值和結(jié)束值抗果,設(shè)置監(jiān)聽器筋帖,就可以得到數(shù)值平滑過渡,根據(jù)過渡的值冤馏,繼續(xù)繪制日麸,達(dá)到對(duì)自定義view的動(dòng)畫。
valueAnimator= ValueAnimator.ofFloat(startF, endF);
valueAnimator.setDuration(time);
//均速
valueAnimator.setInterpolator(newLinearInterpolator());
valueAnimator.setRepeatCount(ValueAnimator.INFINITE);//無限循環(huán)
valueAnimator.setRepeatMode(ValueAnimator.RESTART);//從新開始逮光,還有一個(gè)模式是倒著開始
valueAnimator.addUpdateListener(newValueAnimator.AnimatorUpdateListener() {
@Override
public voidonAnimationUpdate(ValueAnimator valueAnimator) {
floatvalue = (float) valueAnimator.getAnimatedValue();
startAngle=360* value;//平滑過度的值代箭,計(jì)算當(dāng)前的度數(shù),賦值給開始值涕刚,重新繪制嗡综。
invalidate();
}
});
valueAnimator.addListener(newAnimatorListenerAdapter() {
@Override
public voidonAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
});
常用的方法:
drawArc(@NonNull RectF oval,floatstartAngle,floatsweepAngle,boolean useCenter,
@NonNull Paint paint)//繪制圓弧,默認(rèn)的初始值為右側(cè)開始杜漠,度數(shù)為0极景;
參數(shù):一個(gè)矩形,初始弧度驾茴,結(jié)束弧度盼樟,是否顯示圓弧的兩側(cè)線,畫筆锈至。晨缴。。