首页 > 其他分享 >Android开发 Jetpack Compose Canvas

Android开发 Jetpack Compose Canvas

时间:2024-05-06 09:44:19浏览次数:36  
标签:Compose center Color Jetpack color Offset Android dp size

版权声明

本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/17657716.html

本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。

前言

  此篇博客讲解Canvas的使用

 

画线

正常的线条

效果图

代码

strokeWidth 是线条的宽度

color 为线条的颜色

@Preview
@Composable
fun Line() {
    Canvas(
        modifier = Modifier
            .fillMaxSize()
    ) {
        drawLine(strokeWidth = 10f, color = Color.Red, start = Offset(0f,size.height/2), end = Offset(size.width,size.height/2))
    }
}

渐变线条

效果图

 

代码

通过brush设置渐变颜色效果

@Preview
@Composable
fun Line() {
    Canvas(
        modifier = Modifier
            .fillMaxSize()
    ) {
        val brush = Brush.linearGradient(listOf(Color.Green,Color.Red), start = Offset(0f,size.height/2), end = Offset(size.width,size.height/2))
        drawLine(strokeWidth = 10f, brush = brush, start = Offset(0f,size.height/2), end = Offset(size.width,size.height/2))
    }
}

线头形状

一共有3种StrokeCap.Butt、StrokeCap.Round、StrokeCap.Square,分别是平头、圆头、方头, StrokeCap.Butt与StrokeCap.Square效果接近,但是StrokeCap.Square会让线条更长一些。

效果图 

代码

@Preview
@Composable
fun Line() {
    Canvas(
        modifier = Modifier
            .fillMaxSize()
    ) {
        /**
         * StrokeCap.Butt
         */
        drawLine(
            strokeWidth = 30f,
            color = Color.Red,
            start = Offset(0f, center.y),
            end = Offset(center.x, center.y),
            cap = StrokeCap.Butt
        )

        /**
         * StrokeCap.Round
         */
        drawLine(
            strokeWidth = 30f,
            color = Color.Red,
            start = Offset(0f, center.y + 100),
            end = Offset(center.x, center.y + 100),
            cap = StrokeCap.Round
        )

        /**
         * StrokeCap.Square
         */
        drawLine(
            strokeWidth = 30f,
            color = Color.Red,
            start = Offset(0f, center.y + 200),
            end = Offset(center.x, center.y + 200),
            cap = StrokeCap.Square
        )
    }
}

虚线

效果图

代码

@Preview
@Composable
fun Line() {
    Canvas(
        modifier = Modifier
            .fillMaxSize()
    ) {
        drawLine(
            strokeWidth = 15f,
            color = Color.Red,
            start = Offset(0f, center.y),
            end = Offset(size.width, center.y),
            //floatArrayOf 第一个参数是每个线段的长度  第二个参数是空行间隔的长度
            //phase这个参数是设置线头截取的长度
            pathEffect = PathEffect.dashPathEffect(floatArrayOf(50f, 50f), phase = 5f)
        )
    }
}

画圆

实心圆

效果图

代码

Canvas(modifier = Modifier.align(Alignment.Center).size(150.dp)) {
    drawCircle(color = Color.Gray, radius = 50.dp.toPx())
}

空心圆

效果图

代码

Canvas(
    modifier = Modifier
        .align(Alignment.Center)
        .size(150.dp)
) {
    drawCircle(
        color = Color.Gray,
        radius = 50.dp.toPx(),
        style = Stroke(15.dp.toPx())
    )
}

画半圆

实心半圆

效果图

代码

Canvas(modifier = Modifier.align(Alignment.BottomCenter).size(150.dp)) {
    drawArc(
        color = Color.Gray,
        startAngle = -180f,
        sweepAngle = 180f,
        useCenter = true,
    )
}

空心半圆

效果图

代码

Canvas(modifier = Modifier.align(Alignment.BottomCenter).size(150.dp)) {
    drawArc(
        color = Color.Gray,
        startAngle = -180f,
        sweepAngle = 180f,
        useCenter = true,
        style = Stroke(15.dp.toPx(), cap = StrokeCap.Round)
    )
}

中心不封口的空心半圆

效果图

代码

Canvas(modifier = Modifier.align(Alignment.BottomCenter).size(150.dp)) {
    drawArc(
        color = Color.Gray,
        startAngle = -180f,
        sweepAngle = 180f,
        useCenter = false,//关键是这里设置为false
        style = Stroke(15.dp.toPx(), cap = StrokeCap.Round)
    )
}

椭圆

实心椭圆

效果图

代码

Canvas(
    modifier = Modifier
        .align(Alignment.Center)
        .size(150.dp)
) {
    drawOval(
        color = Color.Gray,
        topLeft = Offset(100f,20f), //绘制图形的位置偏移量
        size = Size(100.dp.toPx(),50.dp.toPx()), //大小
    )
}

空心椭圆

效果图

代码

Canvas(
    modifier = Modifier
        .align(Alignment.Center)
        .size(150.dp)
) {
    drawOval(
        color = Color.Gray,
        size = Size(150.dp.toPx(),100.dp.toPx()),
        style = Stroke(15.dp.toPx())
    )
}

Path

二阶贝塞尔曲线

效果图

代码

@Preview(widthDp = 713, heightDp = 265, backgroundColor = 0xFFFFFFFF)
@Composable
fun quadraticBezierTo() {
    Canvas(
        modifier = Modifier
            .padding(horizontal = 20.dp, vertical = 7.dp)
            .width(713.dp)
            .height(265.dp)
    ) {
        val startX = 200f //起始位置X
        val startY = 200f //起始位置Y
        val controlX = 300f //控制点位置X
        val controlY = 100f   //控制点位置Y
        val endX = 400f     //结束位置X
        val endY = 200f     //结束位置Y

        val path = Path()
        //移动起始位置
        path.moveTo(startX,startY)
        //绘制贝塞尔曲线
        path.quadraticBezierTo(controlX, controlY , endX, endY)
        drawPath(path = path, color = Color.Green)
        //绘制辅助点,帮助理解
        drawCircle(color = Color.White, center = Offset(startX,startY), radius = 5f) //白色是起始点
        drawCircle(color = Color.Red, center = Offset(controlX,controlY), radius = 5f) //红色是控制点
        drawCircle(color = Color.Yellow, center = Offset(endX,endY), radius = 5f)   //黄色是结束点
    }
}

三阶贝塞尔曲线

效果图

代码

@Preview(widthDp = 713, heightDp = 265, backgroundColor = 0xFFFFFFFF)
@Composable
fun cubicTo() {
    Canvas(
        modifier = Modifier
            .padding(horizontal = 20.dp, vertical = 7.dp)
            .width(713.dp)
            .height(265.dp)
    ) {
        val startX = 200f //起始位置X
        val startY = 200f //起始位置Y
        val control1X = 300f //控制点1位置X
        val control1Y = 100f   //控制点1位置Y
        val control2X = 400f //控制点2位置X
        val control2Y = 100f   //控制2点位置Y
        val endX = 500f     //结束位置X
        val endY = 200f     //结束位置Y

        val path = Path()
        //移动起始位置
        path.moveTo(startX, startY)
        //绘制贝塞尔曲线
        path.cubicTo(control1X, control1Y, control2X, control2Y, endX, endY)
        drawPath(path = path, color = Color.Green)
        //绘制辅助点,帮助理解
        drawCircle(color = Color.White, center = Offset(startX, startY), radius = 5f) //白色是起始点
        drawCircle(color = Color.Red, center = Offset(control1X, control1Y), radius = 5f) //红色是控制点
        drawCircle(color = Color.Red, center = Offset(control2X, control2Y), radius = 5f) //红色是控制点
        drawCircle(color = Color.Yellow, center = Offset(endX, endY), radius = 5f)   //黄色是结束点
    }
}

drawIntoCanvas

 

 

https://blog.csdn.net/m0_37508087/article/details/120243810 参考
https://zhuanlan.zhihu.com/p/459427529?utm_id=0
https://www.6hu.cc/archives/45182.html  参考

 

end

标签:Compose,center,Color,Jetpack,color,Offset,Android,dp,size
From: https://www.cnblogs.com/guanxinjing/p/17657716.html

相关文章

  • 开发Android应用程序,在Android10的系统上提示网络出错?
    今天维护以前开发的一个Android客户端程序,发版后,有用户说自己手机安装,无法登录,首屏打开后(有网络通过接口加载服务器数据并显示的行为),提示网络出错。但是我在我自己手上的PDA设备(Android4.4)正常,然后又去找了一台Android设备,是Android8.0的,也正常。初步怀疑是高版本没兼容的问题......
  • 本地化部署hoppscotch —— 使用docker compose一键部署 + https支持
    一、前言研究了好久,终于完成了hoppscotch本地一键部署,并支持https。hoppscotch的介绍这里就不做过多描述,网络上非常多,这里先放几张使用效果1、api界面 2、管理界面 2、部署效果:a.使用脚本,./create_and_start.sh(后面会提供),需要传入本机ip(能访问到的),可用的smtpurl(建议使......
  • docker-compose部署ELK
    参考地址:https://www.cnblogs.com/zys2019/p/14816634.html1.概述笔者在学习docker的相关知识,本着talkischeapshowmethecode原则,实际操作下,正好上面的博主分享了文档,我照着做成功了,只是有些细节上面的问题,需要解决下2.ELK架构Elasticsearch是个开源分布式搜索引擎,提......
  • android Service和activity通信
     在Android中,Service和Activity可以通过多种方式进行通信。以下是一个简单的例子,展示了如何使用Intent、Binder和Interface来实现Service和Activity之间的通信。首先,定义一个Service并创建一个绑定器类(Binder): publicclassMyServiceextendsService{privatefinal......
  • android 反编译APK取源代码。
    坑,自己写的AndroidAPK程序,发现线上版本是1.9.4,本地的代码版本却是1.9.1。不知道到底怎么回事,svn里面也没有日志记录。。。。。只能从线上apk反编译来看看了,幸好这个升级日志里面,更新内容很少。。。。。真的是诡异 反编译过程如下,其他地方转来的,仅做记录用,方便自己以后按这......
  • 【Android】Binder的Oneway拦截
    在某些虚拟化,免安装,打点,环境检测,拦截器等场景,针对Android系统服务接口的拦截是常用的技术方案。通常只是针对正向的接口调用,如果涉及被动的服务回调拦截,则实现起来就有些许麻烦。说明由于我们容器产品的特性,需要将应用完整的运行起来,所以必须要对各系统服务(超过100+系统服务)......
  • 使用 docker-compose 部署 oracle19c
    目前应该很少有公司再使用oracle11gR2版本了,官方在2020-12-31日后就停止支持和维护了,绝大多数公司应该都升级到oracle19c版本了。因此当前oracle数据库中使用最多的版本就是oracle19c了,但是官方对其支持和维护的截止日期是2026-3-31。其实即使官方停止技术支持和......
  • docker-compose 安装
    1、下载最新版的docker-compose文件1)链接下载https://link.zhihu.com/?target=https%3A//github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_642)命令下载sudocurl-L"https://github.com/docker/compose/releases/download/v2.5.0/docker-comp......
  • Android 系统编译
    一、流程根目录下的Makefile--->build/core/main.mk---->build/core/Makefile1.1根目录下的Makefile###DONOTEDITTHISFILE###includebuild/core/main.mk###DONOTEDITTHISFILE###1.2main.mk.PHONY:droidcoredroidcore:kernelimage\......
  • Android在创建Actively的同时创建.xml文件
    如图右键想要创建新activity的包,选择new——》activity——》emptyactivity 输入新activity的信息——》finish 创建成功 ......