ddu-canvas

一、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è)矩形

ValueAnimator設(shè)置動(dòng)畫

通過設(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è)線,畫筆锈至。晨缴。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末峡捡,一起剝皮案震驚了整個(gè)濱河市击碗,隨后出現(xiàn)的幾起案子筑悴,更是在濱河造成了極大的恐慌,老刑警劉巖延都,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雷猪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡晰房,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門射沟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來殊者,“玉大人,你說我怎么就攤上這事验夯〔猓” “怎么了?”我有些...
    開封第一講書人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵挥转,是天一觀的道長(zhǎng)海蔽。 經(jīng)常有香客問我,道長(zhǎng)绑谣,這世上最難降的妖魔是什么党窜? 我笑而不...
    開封第一講書人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮借宵,結(jié)果婚禮上幌衣,老公的妹妹穿的比我還像新娘。我一直安慰自己壤玫,他們只是感情好豁护,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著欲间,像睡著了一般楚里。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上猎贴,一...
    開封第一講書人閱讀 49,879評(píng)論 1 290
  • 那天班缎,我揣著相機(jī)與錄音,去河邊找鬼嘱能。 笑死吝梅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惹骂。 我是一名探鬼主播苏携,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼对粪!你這毒婦竟也來了右冻?” 一聲冷哼從身側(cè)響起装蓬,我...
    開封第一講書人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纱扭,沒想到半個(gè)月后牍帚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乳蛾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年暗赶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肃叶。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蹂随,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出因惭,到底是詐尸還是另有隱情岳锁,我是刑警寧澤,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布蹦魔,位于F島的核電站激率,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏勿决。R本人自食惡果不足惜乒躺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剥险。 院中可真熱鬧聪蘸,春花似錦、人聲如沸表制。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽么介。三九已至娜遵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壤短,已是汗流浹背设拟。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留久脯,地道東北人纳胧。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像帘撰,于是被迫代替她去往敵國和親跑慕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

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

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,373評(píng)論 0 17
  • 版權(quán)聲明:本文為博主原創(chuàng)文章核行,未經(jīng)博主允許不得轉(zhuǎn)載 前言 Canvas 本意是畫布的意思,然而將它理解為繪制工具一...
    cc榮宣閱讀 41,547評(píng)論 1 47
  • Android中使用圖形處理引擎牢硅,2D部分是android SDK內(nèi)部自己提供,3D部分是用Open GL ES ...
    溫暖的外星閱讀 3,163評(píng)論 2 10
  • 一芝雪、概述 1. 四線格與基線 小時(shí)候减余,我們?cè)趧傞_始學(xué)習(xí)寫字母時(shí),用的本子是四線格的惩系,我們必須把字母按照規(guī)則寫在四線...
    addapp閱讀 7,629評(píng)論 2 17
  • Android - Canvas 簡(jiǎn)單總結(jié): http://www.cnblogs.com/hwgt/p/5416...
    zhangdong0921閱讀 450評(píng)論 0 0