drawLine
fun drawLine(
color: Color,
start: Offset,
end: Offset,
strokeWidth: Float = Stroke.HairlineWidth,
cap: StrokeCap = Stroke.DefaultCap,
pathEffect: PathEffect? = null,
/*FloatRange(from = 0.0, to = 1.0)*/
alpha: Float = 1.0f,
colorFilter: ColorFilter? = null,
blendMode: BlendMode = DefaultBlendMode
)
/**
* brush 是刷子,就填充線的顏色的刷子,主要是處理漸變的 主要有l(wèi)inearGradient,horizontalGradient暮芭,verticalGradient微谓,radialGradient填具,sweepGradient
* color 是線的顏色
* start 是線的起始點(diǎn)位置
* end 是線的終點(diǎn)位置
* strokeWidth 線的寬度
* cap 線段末端的形狀。 三種取值:StrokeCap.Butt平的效果(以平邊開始和結(jié)束輪廓觅够,沒有延伸陶因。)StrokeCap.Round 圓形效果(以半圓延伸開始和結(jié)束輪廓)StrokeCap.Square 平的效果(以半正方形延伸開始和結(jié)束輪廓)
* pathEffect 設(shè)置顯示效果(比如虛線)
* PathEffect.cornerPathEffect(radius: Float) 將線段之間的銳角替換為指定半徑的圓角 radius是半徑
* PathEffect.dashPathEffect(intervals: FloatArray, phase: Float = 0f) 將形狀繪制為具有給定間隔的一系列破折號(hào)洞斯。比如虛線 例如interval={20,5},第一個(gè)參數(shù)表示虛線的長度是20烙如,5是虛線之間的間隔是5. phase 偏移
* PathEffect.chainPathEffect(outer: PathEffect, inner: PathEffect) 創(chuàng)建一個(gè)PathEffect,將內(nèi)部效果應(yīng)用于路徑毅否,然后應(yīng)用外部效果
* PathEffect.stampedPathEffect(shape: Path, advance: Float, phase: Float,style: StampedPathEffectStyle) 用path表示的指定形狀沖壓繪制的路徑. shape要踩踏的路徑,advance 每個(gè)沖壓形狀之間的前進(jìn)間距, phase 在壓印第一個(gè)形狀之前要偏移的相位量, style如何在每個(gè)位置轉(zhuǎn)換形狀亚铁,因?yàn)樗菦_壓. style有三種取值 StampedPathEffectStyle.Translate 平移 ,StampedPathEffectStyle.Rotate 旋轉(zhuǎn)螟加,StampedPathEffectStyle.Morph 變形
* alpha 透明度
* colorFilter 用于修改在其安裝的[Paint]上繪制的每個(gè)像素的顏色的效果
* blendMode 混合模式
*/
drawRect
fun drawRect(
brush: Brush,
color: Color,
topLeft: Offset = Offset.Zero,
size: Size = this.size.offsetSize(topLeft),
/*@FloatRange(from = 0.0, to = 1.0)*/
alpha: Float = 1.0f,
style: DrawStyle = Fill,
colorFilter: ColorFilter? = null,
blendMode: BlendMode = DefaultBlendMode
)
/**
* brush 刷子
* color 顏色
topLeft 左上角點(diǎn)的坐標(biāo)
size 大小徘溢,比如Size(w,h) w是寬度,h是高度
cornerRadius 是具體的圓角
alpha 透明度
style DrawStyle 可以是Fill填充捆探,也可以是Stroke然爆,線條
colorFilter 用于修改在其安裝的[Paint]上繪制的每個(gè)像素的顏色的效果。
blendMode 混合模式
*/
drawImage
fun drawImage(
image: ImageBitmap,
topLeft: Offset = Offset.Zero,
/*@FloatRange(from = 0.0, to = 1.0)*/
alpha: Float = 1.0f,
style: DrawStyle = Fill,
colorFilter: ColorFilter? = null,
blendMode: BlendMode = DefaultBlendMode
)
/**
* image 圖片
topLeft 左上角
alpha 透明度
style 繪制類型是Fill還是Stoke
colorFilter 用于修改在其安裝的[Paint]上繪制的每個(gè)像素的顏色的效果黍图。
blendMode 混合模式后面講
srcOffset IntOffset類型原圖像的偏移
srcSize IntSize類型 原圖像的大小
dstOffset IntOffset 類型目標(biāo)圖像的左上角的位置
dstSize IntSize大小 目標(biāo)圖像的大小
*/
drawCircle
fun drawCircle(
color: Color,
radius: Float = size.minDimension / 2.0f,
center: Offset = this.center,
/*@FloatRange(from = 0.0, to = 1.0)*/
alpha: Float = 1.0f,
style: DrawStyle = Fill,
colorFilter: ColorFilter? = null,
blendMode: BlendMode = DefaultBlendMode
)
/*
brush 刷子
color 顏色
radius 半徑
center 圓形
alpha 透明度
style 填充方式 Fill跟Stroke
colorFilter 用于修改在其安裝的[Paint]上繪制的每個(gè)像素的顏色的效果曾雕。
blendMode 混合模式
*/
drawOval
fun drawOval(
color: Color,
topLeft: Offset = Offset.Zero,
size: Size = this.size.offsetSize(topLeft),
/*@FloatRange(from = 0.0, to = 1.0)*/
alpha: Float = 1.0f,
style: DrawStyle = Fill,
colorFilter: ColorFilter? = null,
blendMode: BlendMode = DefaultBlendMode
)
/*brush 刷子跟上面一致
color 顏色
topLeft 左上角的坐標(biāo)
size 大小
alpha 透明度
style 填充類型
colorFilter 用于修改在其安裝的[Paint]上繪制的每個(gè)像素的顏色的效果。
blendMode 混合模式*/
drawArc
fun drawArc(
color: Color,
startAngle: Float,
sweepAngle: Float,
useCenter: Boolean,
topLeft: Offset = Offset.Zero,
size: Size = this.size.offsetSize(topLeft),
/*@FloatRange(from = 0.0, to = 1.0)*/
alpha: Float = 1.0f,
style: DrawStyle = Fill,
colorFilter: ColorFilter? = null,
blendMode: BlendMode = DefaultBlendMode
)
/*brush 刷子
color 顏色
startAngle 開始的角度
sweepAngle 劃過的角度
useCenter 是否連接圓心
topLeft 左上角的位置
size 大小
alpha 透明度
style 填充模式
colorFilter 用于修改在其安裝的[Paint]上繪制的每個(gè)像素的顏色的效果助被。Image講解里有講到
blendMode 混合模式*/
drawPath
fun drawPath(
path: Path,
color: Color,
/*@FloatRange(from = 0.0, to = 1.0)*/
alpha: Float = 1.0f,
style: DrawStyle = Fill,
colorFilter: ColorFilter? = null,
blendMode: BlendMode = DefaultBlendMode
)
/*path 路徑
brush 刷子
color 顏色
alpha 透明度
style 填充類型
colorFilter 用于修改在其安裝的[Paint]上繪制的每個(gè)像素的顏色的效果剖张。Image講解里有講到
blendMode 混合模式*/
drawPoints
fun drawPoints(
points: List<Offset>,
pointMode: PointMode,
color: Color,
strokeWidth: Float = Stroke.HairlineWidth,
cap: StrokeCap = StrokeCap.Butt,
pathEffect: PathEffect? = null,
/*@FloatRange(from = 0.0, to = 1.0)*/
alpha: Float = 1.0f,
colorFilter: ColorFilter? = null,
blendMode: BlendMode = DefaultBlendMode
)
/*
points 點(diǎn)的集合
pointMode 用于指示如何繪制點(diǎn)。有三種取值PointMode.Points 分別畫點(diǎn)揩环,PointMode.Lines 畫線(點(diǎn)集合兩兩組合劃線搔弄,奇數(shù)的話最后一個(gè)不管),PointMode.Polygon 畫多邊形
color 顏色
brush 刷子 設(shè)置漸變
strokeWidth 寬度
pathEffect 跟上面drawLine的一致
alpha 透明度
colorFilter 用于修改在其安裝的[Paint]上繪制的每個(gè)像素的顏色的效果丰滑。
blendMode 混合模式
*/
inset
inline fun DrawScope.inset(
left: Float,
top: Float,
right: Float,
bottom: Float,
block: DrawScope.() -> Unit
) {
drawContext.transform.inset(left, top, right, bottom)
block()
drawContext.transform.inset(-left, -top, -right, -bottom)
}
/*left左邊平移多少
top 頂部平移多少
right 右邊平移多少
bottom 底部平移多少
horizontal 橫向平移多少
vertical 豎向平移多少*/
translate
inline fun DrawScope.translate(
left: Float = 0.0f,
top: Float = 0.0f,
block: DrawScope.() -> Unit
) {
drawContext.transform.translate(left, top)
block()
drawContext.transform.translate(-left, -top)
}
/**
* left 左邊平移多少
top頂部平移多少
*/
rotate
inline fun DrawScope.rotate(
degrees: Float,
pivot: Offset = center,
block: DrawScope.() -> Unit
) = withTransform({ rotate(degrees, pivot) }, block)
/**
* degrees 順時(shí)針旋轉(zhuǎn)的角度
pivot 旋轉(zhuǎn)的中心點(diǎn) (默認(rèn)是圖形的中心)
radians 順時(shí)針旋轉(zhuǎn)的弧度
pivot 旋轉(zhuǎn)的中心點(diǎn)(默認(rèn)是圖形的中心)
*/
scale
inline fun DrawScope.scale(
scale: Float,
pivot: Offset = center,
block: DrawScope.() -> Unit
) = withTransform({ scale(scale, scale, pivot) }, block)
/*scale 縮放的大小
pivot 縮放的中心點(diǎn)
scaleX X軸縮放多少
scaleY Y軸縮放所少
pivot 縮放的中心點(diǎn)*/
clipRect
inline fun DrawScope.clipRect(
left: Float = 0.0f,
top: Float = 0.0f,
right: Float = size.width,
bottom: Float = size.height,
clipOp: ClipOp = ClipOp.Intersect,
block: DrawScope.() -> Unit
) = withTransform({ clipRect(left, top, right, bottom, clipOp) }, block)
/*left 左邊的坐標(biāo)
top 頂部的坐標(biāo)
right 右邊的坐標(biāo)
bottom 底部的坐標(biāo)
clipOp 裁剪的類型ClipOp ClipOp.Intersect是裁剪出來的矩形顾犹。ClipOp.Difference從當(dāng)前剪輯中減去提供的矩形*/
clipPath
inline fun DrawScope.clipPath(
path: Path,
clipOp: ClipOp = ClipOp.Intersect,
block: DrawScope.() -> Unit
) = withTransform({ clipPath(path, clipOp) }, block)
/*path 是路徑
clipOp 裁剪的類型ClipOp ClipOp.Intersect是裁剪出來的矩形。ClipOp.Difference從當(dāng)前剪輯中減去*/
withTransform 組合
inline fun DrawScope.withTransform(
transformBlock: DrawTransform.() -> Unit,
drawBlock: DrawScope.() -> Unit
) = with(drawContext) {
// Transformation can include inset calls which change the drawing area
// so cache the previous size before the transformation is done
// and reset it afterwards
val previousSize = size
canvas.save()
transformBlock(transform)
drawBlock()
canvas.restore()
size = previousSize
}
Canvas(modifier = Modifier.fillMaxSize()){
val canvasSize = size
val canvasWidth = size.width
val canvasHeight = size.height
withTransform({
translate(left = canvasWidth/5F)
rotate(degrees=45F)
}) {
drawRect(
color = Color.Gray,
topLeft = Offset(x = canvasWidth / 3F, y = canvasHeight / 3F),
size = canvasSize / 3F
)
}
}
BlendMode 混合模式
混合是有個(gè)原圖像src,一個(gè)dst目標(biāo)圖像褒墨,這兩個(gè)圖的相交區(qū)域的各種組合情況炫刷。
Clear 清除 (刪除源圖像和目標(biāo)圖像,不留下任何內(nèi)容)
Src 刪除目標(biāo)圖像貌亭,只繪制源圖像
Dst 刪除源圖像柬唯,只繪制目標(biāo)圖像
SrcOver 源圖和目標(biāo)圖合成,源圖在上
DstOver 目標(biāo)圖和源圖合成圃庭,目標(biāo)圖在上
SrcIn 顯示源圖和目標(biāo)圖相交的部分锄奢,并且只顯示源圖像
DstIn 顯示目標(biāo)圖和源圖相交的部分,并且只顯示目標(biāo)圖
SrcOut 顯示源圖像和目標(biāo)圖不相交的部分剧腻,并且只顯示源圖
DstOut 顯示目標(biāo)圖和源圖像不相交的部分拘央,并且只顯示目標(biāo)圖
SrcAtop 顯示目標(biāo)圖,并且在相交的地方顯示源圖
DstAtop 顯示源圖书在,并在相交的地方顯示目標(biāo)圖
Xor 顯示源圖和目標(biāo)圖灰伟,但相交的位置不顯示(代碼注釋:對(duì)源圖像和目標(biāo)圖像應(yīng)用按位異或運(yùn)算符。這就使得它們重疊的地方保持透明。)
Plus 對(duì)源映像和目標(biāo)映像的組件求和栏账。其中一個(gè)圖像的像素中的透明度降低了該圖像對(duì)相應(yīng)輸出像素的貢獻(xiàn)帖族,就好像該圖像中該像素的顏色較暗一樣
Modulate 將源圖像和目標(biāo)圖像的顏色分量相乘。這只能產(chǎn)生相同或較深的顏色(乘以白色挡爵,1.0竖般,結(jié)果不變;乘以黑色(0.0茶鹃,結(jié)果為黑色)涣雕。合成兩個(gè)不透明圖像時(shí),這與在投影儀上重疊兩個(gè)透明膠片的效果類似闭翩。對(duì)于同樣乘以alpha通道的變量挣郭,請(qǐng)考慮乘以。
Screen 將源圖像和目標(biāo)圖像的分量的逆相乘疗韵,然后求逆結(jié)果兑障。反轉(zhuǎn)組件意味著完全飽和的通道(不透明白色)被視為值0.0,而通常被視為0.0(黑色伶棒,透明)的值被視為1.0旺垒。這基本上與調(diào)制混合模式相同,但是在乘法之前顏色值反轉(zhuǎn)肤无,結(jié)果在渲染之前反轉(zhuǎn)回來先蒋。這只能產(chǎn)生相同或較淺的顏色(乘以黑色,1.0宛渐,結(jié)果不變竞漾;乘以白色(0.0,結(jié)果為白色)窥翩。類似地业岁,在alpha通道中,它只能產(chǎn)生更不透明的顏色寇蚊。這與兩臺(tái)投影儀同時(shí)在同一屏幕上顯示圖像的效果相似笔时。
Overlay 將源圖像和目標(biāo)圖像的分量相乘,然后調(diào)整它們以支持目標(biāo)仗岸。具體來說允耿,如果目標(biāo)值較小,則將其與源值相乘扒怖,而如果源值較小较锡,則將源值的倒數(shù)與目標(biāo)值的倒數(shù)相乘,然后反轉(zhuǎn)結(jié)果盗痒。反轉(zhuǎn)組件意味著完全飽和的通道(不透明白色)被視為值0.0蚂蕴,而通常被視為0.0(黑色,透明)的值被視為1.0。
Darken 通過從每個(gè)顏色通道中選擇最低值來合成源圖像和目標(biāo)圖像骡楼。輸出圖像的不透明度的計(jì)算方法與SrcOver相同熔号。
Lighten 通過從每個(gè)顏色通道中選擇最高值來合成源圖像和目標(biāo)圖像。輸出圖像的不透明度的計(jì)算方法與SrcOver相同鸟整。
ColorDodge 將目標(biāo)除以源的倒數(shù)跨嘉。反轉(zhuǎn)組件意味著完全飽和的通道(不透明白色)被視為值0.0,而通常被視為0.0(黑色吃嘿,透明)的值被視為1.0。注意這個(gè)BlendMode只能在androidapi級(jí)別29及以上使用
ColorBurn :將目標(biāo)的倒數(shù)除以源的倒數(shù)梦重,然后求結(jié)果的倒數(shù)兑燥。反轉(zhuǎn)組件意味著完全飽和的通道(不透明白色)被視為值0.0,而通常被視為0.0(黑色琴拧,透明)的值被視為1.0降瞳。注意這個(gè)BlendMode只能在androidapi級(jí)別29及以上使用
Hardlight : 將源圖像和目標(biāo)圖像的分量相乘,然后調(diào)整它們以有利于源圖像蚓胸。具體來說挣饥,如果源值較小,則將其與目標(biāo)值相乘沛膳,而如果目標(biāo)值較小扔枫,則將目標(biāo)值的倒數(shù)與源值的倒數(shù)相乘,然后反轉(zhuǎn)結(jié)果锹安。反轉(zhuǎn)組件意味著完全飽和的通道(不透明白色)被視為值0.0短荐,而通常被視為0.0(黑色,透明)的值被視為1.0叹哭。注意這個(gè)BlendMode只能在androidapi級(jí)別29及以上使用
Softlight: 對(duì)于低于0.5的源值忍宋,使用ColorDodge;對(duì)于高于0.5的源值风罩,使用ColorBurn糠排。這會(huì)產(chǎn)生類似的效果,但比疊加效果更柔和超升。注意這個(gè)BlendMode只能在androidapi級(jí)別29及以上使用
Difference: 從每個(gè)通道的較大值中減去較小的值入宦。合成黑沒有效果;合成白色將反轉(zhuǎn)其他圖像的顏色廓俭。輸出圖像的不透明度的計(jì)算方法與SrcOver相同云石。注意這個(gè)BlendMode只能在androidapi級(jí)別29及以上使用這種影響類似于排斥,但更為嚴(yán)厲研乒。
Exclusion: 從兩個(gè)圖像的總和中減去兩個(gè)圖像乘積的兩倍汹忠。合成黑沒有效果;合成白色將反轉(zhuǎn)其他圖像的顏色。輸出圖像的不透明度的計(jì)算方法與SrcOver相同宽菜。注意這個(gè)BlendMode只能在androidapi級(jí)別29及以上使用效果類似于差異谣膳,但更柔和。
Multiply: 將源圖像和目標(biāo)圖像的分量相乘铅乡,包括alpha通道继谚。這只能產(chǎn)生相同或較深的顏色(乘以白色,1.0阵幸,結(jié)果不變花履;乘以黑色(0.0,結(jié)果為黑色)挚赊。由于alpha通道也會(huì)相乘诡壁,因此一個(gè)圖像中的完全透明像素(不透明度0.0)會(huì)導(dǎo)致輸出中的完全透明像素。這與DstIn類似荠割,但顏色組合在一起妹卿。
Hue: 獲取源圖像的色調(diào),以及目標(biāo)圖像的飽和度和亮度蔑鹦。其效果是用源圖像著色目標(biāo)圖像夺克。輸出圖像的不透明度的計(jì)算方法與SrcOver相同。在源圖像中完全透明的區(qū)域從目標(biāo)圖像獲取其色調(diào)嚎朽。注意這個(gè)BlendMode只能在androidapi級(jí)別29及以上使用
Saturation: 獲取源圖像的飽和度铺纽,以及目標(biāo)圖像的色調(diào)和亮度。輸出圖像的不透明度的計(jì)算方法與SrcOver相同火鼻。在源圖像中完全透明的區(qū)域從目標(biāo)圖像獲取其飽和度室囊。注意這個(gè)BlendMode只能在androidapi級(jí)別29及以上使用
Color :獲取源圖像的色調(diào)和飽和度,以及目標(biāo)圖像的亮度魁索。其效果是用源圖像著色目標(biāo)圖像融撞。輸出圖像的不透明度的計(jì)算方法與SrcOver相同。源圖像中完全透明的區(qū)域從目標(biāo)處獲取其色調(diào)和飽和度粗蔚。注意這個(gè)BlendMode只能在androidapi級(jí)別29及以上使用
Luminosity :獲取源圖像的亮度尝偎,以及目標(biāo)圖像的色調(diào)和飽和度。輸出圖像的不透明度的計(jì)算方法與SrcOver相同鹏控。在源圖像中完全透明的區(qū)域從目標(biāo)圖像獲取其亮度致扯。注意這個(gè)BlendMode只能在androidapi級(jí)別29及以上使用