Jetpack Compose 之 Canvas

925 阅读2分钟

属性

@Composable
fun Canvas(modifier: Modifier, onDraw: DrawScope.() -> Unit) =
    Spacer(modifier.drawBehind(onDraw))

DrawScope 中包含以下方法

  • drawLine 画线
  • drawRect 画矩形
  • drawImage 画图片
  • drawRoundRect 画圆角矩形
  • drawCircle 画圆
  • drawOval 画椭圆
  • drawArc 画弧
  • drawPath 画路径
  • drawPoints 画点

drawLine 画线

属性

fun drawLine(
    //颜色,这里也可以是 Brush (可以设置过程中某个阶段的颜色)
    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
)
Canvas(modifier = Modifier.fillMaxSize()) {
drawLine(
        color = Color.Blue,
        start = Offset.Zero,
        end = Offset(100f, 100f),
        strokeWidth = Stroke.DefaultMiter,//4.0f
        cap = StrokeCap.Round, //设置圆角
    )
} 

drawRect 画矩形

属性

fun drawRect(
    //颜色,这里也可以是 Brush (可以设置过程中某个阶段的颜色)
    color: Color,
    //左上角起始点位置,默认是 0
    topLeft: Offset = Offset.Zero,
    //矩形的大小
    size: Size = this.size.offsetSize(topLeft),
    /*@FloatRange(from = 0.0, to = 1.0)*/
    //不透明度
    alpha: Float = 1.0f,
    //矩形的风格: Fill 填充满,Stroke 设置宽度,以及其他属性
    style: DrawStyle = Fill,
    colorFilter: ColorFilter? = null,
    blendMode: BlendMode = DefaultBlendMode
)
Canvas(modifier = Modifier.fillMaxSize()) {
drawRect(
        color = Color.Red,
        topLeft = Offset(50f, 50f),
        size = Size(100f, 100f),
        style = Stroke(width = 5f, cap = StrokeCap.Round)
    )
} 

drawImage 画图片

var bitmap:ImageBitmap? = null
with(LocalContext.current) {
bitmap = ImageBitmap.imageResource(id = R.drawable.ic_launcher_foreground)
}
Canvas(modifier = Modifier.fillMaxSize()) {
bitmap?.let { drawImage(it) }
} 

drawRoundRect 画圆角矩形

属性与drawRect一样,会多一个 CornerRadius

Canvas(modifier = Modifier.fillMaxSize()) {
drawRoundRect(
        color = Color.Red,
        topLeft = Offset(50f, 50f),
        size = Size(100f, 100f),
        style = Stroke(width = 5f, cap = StrokeCap.Round),
        cornerRadius = CornerRadius ( 10f , 10f )
    )
} 

drawCircle 画圆

属性

fun drawCircle(
    color: Color,
    //圆的半径
    radius: Float = size.minDimension / 2.0 f,
    //圆的位置,默认居中。
    center: Offset = this.center,
    /*@FloatRange(from = 0.0, to = 1.0)*/
    alpha: Float = 1.0f,
    style: DrawStyle = Fill,
    colorFilter: ColorFilter? = null,
    blendMode: BlendMode = DefaultBlendMode
)
Canvas(modifier = Modifier.fillMaxSize()) {
drawCircle(
        color = Color.Red,
        style = Fill,
        radius = 150f
    )
} 

drawOval 画椭圆

Canvas(modifier = Modifier.fillMaxSize()) {
drawOval(
        topLeft = this.center,
        size = Size(150f, 100f),
        color = Color.Red,
        style = Fill,
    )
} 

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
)
Canvas(modifier = Modifier.fillMaxSize()) {
drawArc(
        color = Color.Red,
        startAngle = 0f,
        sweepAngle = 90f,
        size = Size(100f, 100f),
        useCenter = true
    )
} 

drawPoints 画点

属性

fun drawPoints(
    //点的集合
    points: List<Offset>,
    //点的模式,PointMode.Lines 点连成线
    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
)
Canvas(modifier = Modifier.fillMaxSize()) {
drawPoints(
        listOf(Offset(10f, 10f), Offset(10f, 50f), Offset(50f, 80f), Offset(80f, 100f)),
        pointMode = PointMode.Lines,
        Color.Black,
        strokeWidth = 10f,
        cap = StrokeCap.Round
    )
}