Android繪圖之Shader

Android繪圖之Shader


Shader是繪圖過程中的著色器,它有五個子類:

  • BitmapShader
  • ComposeShader
  • LinearGradient
  • RadialGradient
  • SweepGradient

它一般用在paint.setShader(shader)中实束,paint是一個Paint對象暑竟,shader是一個Shader對象揍魂。

1. BitmapShader


BitmapShader是用來做位圖繪制時紋理的著色器宽闲,位圖可以通過指定的平鋪模式進行重復或者鏡像肃廓。

BitmapShader的構造方法:

  • BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
    • bitmap是我們要進行著色的位圖
    • tileX是我們在X軸的平鋪模式
    • tileY是我們在Y軸的平鋪模式

平鋪模式有三種:

  • Shader.TileMode.CLAMP:如果著色器超出原始邊界范圍挎峦,會復制邊緣顏色缀程。
  • Shader.TileMode.MIRROR:橫向和縱向的重復著色器的圖像拦焚,交替鏡像圖像是相鄰的圖像總是接合。這個官方的說明可能不太好理解杠输,說白了赎败,就是圖像不停翻轉來平鋪,直到平鋪完畢蠢甲。
  • Shader.TileMode.REPEAT: 橫向和縱向的重復著色器的圖像僵刮。

一般來說,當Canvas的寬度(高度)小于等于BitmapShader中Bitmap的寬度(高度)鹦牛,我們會使用Shader.TileMode.CLAMP模式搞糕,否則我們會使用Shader.TileMode.MIRROR或者Shader.TileMode.REPEAT模式。

  • X軸和Y軸平鋪模式分別設置為BitmapShader.TileMode.REPEAT,BitmapShader.TileMode.MIRROR
  • X軸和Y軸平鋪模式分別設置為BitmapShader.TileMode.MIRROR,BitmapShader.TileMode.REPEAT
  • X軸和Y軸平鋪模式都設置為BitmapShader.TileMode.MIRROR
  • X軸和Y軸平鋪模式都設置為BitmapShader.TileMode.REPEAT
  • X軸和Y軸平鋪模式都設置為BitmapShader.TileMode.CLAMP

可以很明顯的看到當X軸和Y軸平鋪模式都設置為BitmapShader.TileMode.CLAMP曼追,Canvas的寬度(高度)大于BitmapShader中Bitmap的寬度(高度)時窍仰,繪制出來的圖像比較丑,我們來看看Canvas的寬度(高度)小于等于BitmapShader中Bitmap的寬度(高度)時的繪圖情況礼殊,這種情況下面我們一般可以將我們的圖像剪切成各種形狀驹吮,最常見的是將圖像剪切成圖像。

2. ComposeShader


ComposeShader是一個組合著色器晶伦,它通過Xfermode將兩個著色器組合起來碟狞。

ComposeShader有兩個構造方法:

  • ComposeShader(Shader shaderA, Shader shaderB, Xfermode mode)
    • shaderA:這個著色器中的顏色被視為Xfermode模式中的“dst”
    • shaderB:這個著色器中的顏色被視為Xfermode模式中的“src”
    • mode:Xfermode的模式
  • ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)
    • mode:也可以看成是Xfermode的模式,更具體地說它是PorterDuffXfermode的模式

3. LinearGradient


LinearGradient是線性漸變的著色器。

LinearGradient有兩個構造方法:

  • LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
    • x0表示漸變的起始點x坐標
    • y0表示漸變的起始點y坐標
    • x1表示漸變的終點x坐標
    • y1表示漸變的終點y坐標
    • colors表示漸變的顏色數(shù)組
    • positions用來指定顏色數(shù)組的相對位置,可以為null婚陪,為null是表示顏色均勻分布
    • tile表示平鋪模式
  • LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)
    • color0表示漸變開始顏色
    • color1表示漸變結束顏色

利用LinearGradient實現(xiàn)一個從藍色線性漸變到紅色的圓形圖:

4. RadialGradient


RadialGradient是徑向漸變著色器族沃。

RadialGradient有兩個構造方法:

  • RadialGradient(float centerX, float centerY, float radius, int[] colors, float[] stops, Shader.TileMode tileMode)
    • centerX:漸變中心x坐標
    • centerY:漸變中心y坐標
    • radius:漸變圓的半徑
    • colors:分布在漸變圓中心到邊緣的顏色
    • stops:取值0-1之間,用來指定顏色數(shù)組的相對位置,可以為null,為null是表示顏色均勻分布
    • tile表示平鋪模式
  • RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, Shader.TileMode tileMode)
    • centerColor表示漸變中心的顏色
    • edgeColor:表示漸變邊緣的顏色

利用RadialGradient實現(xiàn)一個從藍色徑向漸變到紅色的圓形圖:

5. SweepGradient


SweepGradient是繞著一個中心點進行掃描的漸變著色器脆淹。

SweepGradient有兩個構造方法:

  • SweepGradient(float cx, float cy, int[] colors, float[] positions)
    • cx:中心點的x坐標
    • cy:中心點的y坐標
    • colors:在中心點周圍分配的顏色數(shù)組常空,最少包含兩種顏色
    • positions:取值0-1之間,用來指定顏色數(shù)組的相對位置,可以為null盖溺,為null是表示顏色均勻分布
  • SweepGradient(float cx, float cy, int color0, int color1)
    • color0:開始掃描的顏色
    • color1:結束掃描的顏色

利用SweepGradient實現(xiàn)一個從藍色掃描漸變到紅色的圓形圖:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末漓糙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子咐柜,更是在濱河造成了極大的恐慌兼蜈,老刑警劉巖攘残,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拙友,死亡現(xiàn)場離奇詭異,居然都是意外死亡歼郭,警方通過查閱死者的電腦和手機遗契,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來病曾,“玉大人牍蜂,你說我怎么就攤上這事√┩浚” “怎么了鲫竞?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逼蒙。 經常有香客問我从绘,道長,這世上最難降的妖魔是什么是牢? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任僵井,我火速辦了婚禮,結果婚禮上驳棱,老公的妹妹穿的比我還像新娘批什。我一直安慰自己,他們只是感情好社搅,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布驻债。 她就那樣靜靜地躺著,像睡著了一般形葬。 火紅的嫁衣襯著肌膚如雪却汉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天荷并,我揣著相機與錄音合砂,去河邊找鬼。 笑死,一個胖子當著我的面吹牛翩伪,可吹牛的內容都是我干的微猖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼缘屹,長吁一口氣:“原來是場噩夢啊……” “哼凛剥!你這毒婦竟也來了?” 一聲冷哼從身側響起轻姿,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤犁珠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后互亮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犁享,經...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年豹休,在試婚紗的時候發(fā)現(xiàn)自己被綠了炊昆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡威根,死狀恐怖凤巨,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情洛搀,我是刑警寧澤敢茁,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站留美,受9級特大地震影響彰檬,放射性物質發(fā)生泄漏。R本人自食惡果不足惜独榴,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一僧叉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棺榔,春花似錦瓶堕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至忘晤,卻和暖如春宛蚓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背设塔。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工凄吏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓痕钢,卻偏偏與公主長得像图柏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子任连,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內容