ddu-canvas

一、Canvas類android.graphics.Canvas

Canvas類好比手機中的畫紙,我們可以在Canvas上畫圖形或者圖像。一般我們用android來繪畫的時候,需要四個組成部分:

1、位圖:包含像素

2、Canvas畫板:包含繪畫內容,寫入位圖

3、初始圖形:如Rect、Bitmap、text等

4、Paint:用來描述上面初始圖形的顏色和類型等

Canvas類提供了三個構造方法:

Public Canvas();構造一個默認無參的Canvas對象

Public Canvas(Bitmap bitmap);根據一個Bitmap構造一個Canvas對象

Public Canvas(GL gl);根據一個GL來構造一個對象

下面我們來了解一下Canvas類提供的方法:

在Canvas類提供的方法中比較多經常用的是以draw開頭的方法,draw開頭的方法很容易理解就是向畫板中畫圖形,比如可以向Canvas中畫位圖,給圖形填充顏色等。

二、Paint類android.graphics.Paint

Paint類包含有用來畫幾何圖形、文本、位圖的類型和顏色等信息,如果把Canvas類看作是畫板,那我們可以把Paint類看做是畫筆,可以根據需要畫出不同顏色和樣式的圖形、文本等內容。

Paint類有三個構造方法:

Public Paint()構造一個缺省的Paint對象

Public?Paint(int flags);根據指定的flags來構造一個Paint對象,創建之后可以用

setFlags()方法來更改

Public Paint(Paint paint)根據指定的paint對象來構造一個Paint對象

Paint類提供了很多方法來設置和獲取Paint對象的屬性,比如:

public int getColor ()獲得Paint對象的顏色值

public ColorFilter getColorFilter ()獲得顏色過濾器

public float getTextSize ()獲得字體大小數值

public void setStyle (Paint.Style style)設置paint的類型

三Color類android.graphics.Color

此類 定義了一些方法來創建和轉換顏色值。顏色被表示為封裝的數值,這個數值由四個字節組成,分別是:alpha、red、green、blue,這些值是非自 左乘的,也就是說任何透明性只存儲在alpha部分,而不是在顏色組成部分。每一部分按照如下的順序保存:(alpha<<24)| (red<<16)|

Color類提供了12個常量值來代表不同的顏色值,我們在開發工程中可以直接調用這些常量值來設置我們所要修飾的文本、圖形等對象。

Color類提供了一個無參的構造方法Color()

Color類提供了一些方法來進行顏色值的創建和轉換如下:

其中三個方法是用來返回一個顏色常量值的紅綠藍分色,數值分別在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);輸入紅綠藍三色,返回一個RGB顏色值。

下面幾個方法大家可以參考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類定義字體和字體內在的類型。這個類被用在畫筆Paint設置的時候,比如用textSize,textSkewX和textScale設置來指定text在畫的時候如何來顯示和測量。

Typeface 提供了一些常量值來表示自身的一些屬性,比如BOLD,BOLD_ITALIC,ITALIC等,開發者可以用 defaultFrOPhone SDNtyle(int style)獲得內在的Typeface對象。讀者可以參考詳細的API文檔再這里就不再贅述了。

下面我們來看一下Typeface的主要方法。

Typeface類沒有構造方法,通常如果一個類沒有構造函數就無法通過構造來生成一個對象實體,此時一般會有特定的靜態方法來取得這個類的實體。Typeface就提供了四個靜態方法間接來得到Typeface實體分別如下:

Public static Typeface create(Typeface family,int style);

此方法返回一個與已經存在的Typeface字形體系相匹配且類型是指定類型的Typeface。如果你想得到一個與已經存在的Typeface字形體系 相類似,但是樣式不一樣的Typeface時可以調用此方法。其中family參數可以為null,如果為空則表示從默認的Typeface字形體系中選 擇。

Public static Typefaxe create(String familyname,int style);

此方法通過給定的字形體系的名稱familyname和指定的類型返回一個Typeface對象。如果給定字形體系的名稱為null,我們可以通過getStyle()方法來獲得返回Typeface對象的真正的屬性。

Public static Typeface createFromAsset(AssetManager mgr,String path);

此方法通過規定的字體數據來返回一個Typeface對象。第一個參數為資源管理器,第二個參數是指定字體類型。

Public static Typeface defaultFrOPhone SDNtyle(int style);此方法返回一個指定類型的Typeface對象

Typeface還提供了另外三個方法:

Public int getStyle();此方法返回Typeface內在的類型屬性

Public final Boolean isBold();如果getStyle()有BOLD位組將返回true

Public final Boolean isItalic();如果getStyle()有ITALIC位組將返回true

五、Path類android.graphics.Path

Path類(一組區域)的描畫,類囊括多種幾何圖形比如直線線段、二次曲線、三次曲線等,

調用Canvas.drawPath()方法可以將Path以所定義的paint的方式來畫到畫板上或者填出圖形,也可以用paint所指定方式來畫圖形。

六、RectF類android.graphics.RectF和Rect類android.graphics.Rect

RectF 這個類包含一個矩形的四個單精度浮點坐標。矩形通過上下左右4個邊的坐標來表示一個矩形。這些坐標值屬性可以被直接訪問,用width()和 height()方法可以獲取矩形的寬和高。注意:大多數方法不會檢查這些坐標分類是否錯誤(也就是left<=right和top& lt;=bottom).

RectF一共有四個構造方法:

RectF()構造一個無參的矩形

RectF(float left,float top,float right,float bottom)構造一個指定了4個參數的矩形

RectF(Rect F r)根據指定的RectF對象來構造一個RectF對象(對象的左邊坐標不變)

RectF(Rect r)根據給定的Rect對象來構造一個RectF對象

RectF提供了很多方法,下面介紹幾個方法:

Public Boolean contain(RectF r);判斷一個矩形是否在此矩形內,如果在這個矩形內或者和這個矩形等價則返回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)更新這個矩形,使它包含矩形自己和(x,y)這個點。

RectF類提供的方法都比較簡單,容易理解,再此就不再一一贅述

Android.graphics.Rect類,這個類同android.graphics.RectF很相似,不同的地方是Rect類的坐標是用整形表示的,而RectF的坐標是用單精度浮點型表示的。這里大家一定要注意 啊。

七、Point類android.graphics.Point

這個類從字面意思就可以看出它跟點有關系,是點的一個對象類。

這個類有兩個屬性,分別是:X坐標和y坐標。

構造函數有三個:Point(),Point(int x,int y),Point(Point p)

主要方法有:

Public void set(x,y);重新設定一下x,y的坐標

Public final void offset(int dx,int dy);給坐標一個補償值,值可以使正的也可以是負的。

Public final void negate();否定坐標值。

Point類和android.graphics.PointF類似,不同點是前者坐標值的類型是int型,而后者的坐標值是float型。除此之外PointF類多加了幾個方法,比如:

Public final float length();返回(0,0)點到該點的距離。

Public static float length(float x,float y);返回(0,0)點到(x,y)點的距離。

canvas.save();和canvas.restore();是兩個相互匹配出現的,作用是用來保存畫布的狀態和取出保存的狀態的。這里稍微解釋一下,

當我們對畫布進行旋轉,縮放,平移等操作的時候其實我們是想對特定的元素進行操作,比如圖片,一個矩形等,但是當你用canvas的方法來進行這些操作的時候,其實是對整個畫布進行了操作,那么之后在畫布上的元素都會受到影響,所以我們在操作之前調用canvas.save()來保存畫布當前的狀態,當操作之后取出之前保存過的狀態,這樣就不會對其他的元素進行影響。

畫布旋轉后的左邊中心點會變。

publicRectF(floatleft,floattop,floatright,floatbottom) 參數為坐標點,可簡單理解為 左上點與右下點 構成的一個矩形

ValueAnimator設置動畫

通過設置開始值和結束值,設置監聽器,就可以得到數值平滑過渡,根據過渡的值,繼續繪制,達到對自定義view的動畫。

valueAnimator= ValueAnimator.ofFloat(startF, endF);

valueAnimator.setDuration(time);

//均速

valueAnimator.setInterpolator(newLinearInterpolator());

valueAnimator.setRepeatCount(ValueAnimator.INFINITE);//無限循環

valueAnimator.setRepeatMode(ValueAnimator.RESTART);//從新開始,還有一個模式是倒著開始

valueAnimator.addUpdateListener(newValueAnimator.AnimatorUpdateListener() {

@Override

public voidonAnimationUpdate(ValueAnimator valueAnimator) {

floatvalue = (float) valueAnimator.getAnimatedValue();

startAngle=360* value;//平滑過度的值,計算當前的度數,賦值給開始值,重新繪制。

invalidate();

}

});

valueAnimator.addListener(newAnimatorListenerAdapter() {

@Override

public voidonAnimationEnd(Animator animation) {

super.onAnimationEnd(animation);

}

});

常用的方法:

drawArc(@NonNull RectF oval,floatstartAngle,floatsweepAngle,boolean useCenter,

@NonNull Paint paint)//繪制圓弧,默認的初始值為右側開始,度數為0;

參數:一個矩形,初始弧度,結束弧度,是否顯示圓弧的兩側線,畫筆。。。

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

推薦閱讀更多精彩內容