废话之前先上图吧,如果不是有人告诉,你可以一眼看出哪个是真哪个是假吗?

仿制整个页面(仅仅页面)大概花了我两个小时,不过仅仅是静态的、不可点击的。图有形似而无功能。

自定义绘制

Jetpack Compose 自定义绘制的文章其实并不少了,基本代码上和View体系基本类似,就是方法上有所差异

详细的内容可以见其他作者的文章,如

  • 路很长OoO的JetPack-Compose - 自定义绘制 - 掘金 (juejin.cn)
  • RugerMc的使用 Jetpack Compose 完成自定义绘制 - 掘金 (juejin.cn)
  • ……

我就不赘述

上述代码中,中间那块数据图就是自己画的(Keep 用的是 RecyclerView)。大致上,包括这几个部分

  1. 四个浅色矩形和底部文字
  2. 三条浅色横线和一条深色横线
  3. 中间的深色矩形和底部文字
  4. 中间竖线、矩形和底部的小线段

其中1->3的顺序不能更改,因为三条浅色横线在浅色矩形之上,但是在深色矩形之下

浅色矩形

页面上一共4个浅色矩形,观察Keep可知,它们的高度与 对应数据和运动记录中最长时间之比 成正比

所以先计算一下最大的数字,找一些变量存储宽高:

// 画布的宽高
val w = size.width
val h = size.height
// 最高的矩形占的高度(3/6)
val maxH = h / 2
// 最大的数字,所有矩形以这个为基准计算高度
val maxNum = listData.maxOf { it.num }// 以及一个参数
startIndex: Int //最左侧的矩阵对应的index

其中列表BeanItemData定义如下:

data class ItemData(val content :String, val num : Int)

然后计算对应位置(左上角)和大小(宽高)即可

for (i in 0 until min(5, listData.size - startIndex)){val data = listData[startIndex + i]if (i != 2){// 画四个浅色矩形val blockH = data.num.toFloat() / maxNum * maxHdrawRect(lightColor, Offset(w / 4f * i - blockW / 2, 0.833f * h - blockH), Size(blockW, blockH))}
}

浅色矩形对应的文字也是类似,不过由于Canvas并不能直接画文字,所以要先获取到canvas.nativeCanvas再在它上面drawText

for(...){// 浅色矩形下方的文字paint.color = Color.Gray.toArgb()drawIntoCanvas {FunnyCanvasUtils.drawCenterText(it.nativeCanvas, data.content, w / 4f * i , h * 7 / 8 + 2f,  rect, paint)}
}

这里用到了一个方法drawCenterText就是让文字以给定的x,y横向中心点,纵向baseline为基准进行绘制,感兴趣的可以看源码(见文末),此处不在赘述

画横线

画线的方法就是drawLine,给出两个Offset分别表示起点和终点即可。唯一注意的是,由于要画虚线,所以要设置pathEffect = PathEffect.dashPathEffect并给出一个二元数组(表示线长、间隔)

// 三条浅色横线
for (i in 2 until 5){drawLine(Color.Black.copy(alpha = 0.5f), Offset(0f, h * i / 6), Offset(w, h * i / 6), pathEffect = PathEffect.dashPathEffect(floatArrayOf(10f,10f)))
}

其余的就不赘述了,本质上就是计算着不同位置,画不同的东西而已。可以自行见源码

其他内容

至于图片上的其他部分,则是这样组成的:

最上面一部分直接就是图片(哈哈)

这一行是一个Row,两端对齐

这一行也是一个Row,以文本baseline对齐

下面是Row套三个Column

后续

暂时就是这样,Jetpack Compose 的 布局和绘制到此5篇(前几篇见我的文章),下一篇我会发个很好玩儿的内容,是Layout的蜜汁用法,敬请期待。

如果你对 Jetpack Compose 开发完整项目有兴趣,鄙人毛遂自荐下自己的开源项目FunnySaltyFish/FunnyTranslation: 基于Jetpack Compose开发的翻译软件,支持多引擎、插件化~

本文所有代码见此处

Jetpack Compose 自定义绘制——高仿Keep周运动数据页面相关推荐

  1. 高仿简书Android,高仿简书个人中心页面

    高仿简书个人中心页面 Demo下载地址: 先贴上效果图 1. 步骤 1.1 把APP的主题改为NoAction 1.2 引入Material Design 包 implementation 'com. ...

  2. 高仿简书个人中心页面

    高仿简书个人中心页面 Demo下载地址: 先贴上效果图 1. 步骤 1.1 把APP的主题改为NoAction <!-- Base application theme. --><st ...

  3. 自定义view高仿稀土掘金loading闪动字体效果

    注:该文章同步发布到稀土掘金:链接 前言 由于通勤时间较长,在路上总会有时间刷刷文章.稀土掘金就是常用的一个app(这里非广告,哈哈哈).前段时间,发表了篇文章:# 使用CollapsingToolb ...

  4. 防qq页面多边形html5,高仿QQ Xplan的H5页面

    上个月底,在朋友圈看到一个号称"这可能是地球上最美的h5"的分享,点进入后发现这个h5还很别致,思考了一会,决定要不高仿一个? 到今天为止,高仿基本完成 除了手机端的media控制 ...

  5. 高仿QQ Xplan的H5页面

    概述 这个h5的主要玩法很简单:地球自转的时候会播放背景音乐(比如海浪声),为了找到这个声音是从哪个地球上哪个地方传来的,需要长按下方的按钮,这时地球会自动转动到目标地点,然后镜头拉近,穿过云层,最后 ...

  6. 自定义View高仿懂球帝我是教练效果

    前言 这几天很多欧洲球队来中国进行热身赛,不知道喜欢足球的各位小伙伴们有没有看球.喜欢足球的朋友可能知道懂球帝APP,鄙人也经常使用这个应用,里面有一个我是教练的功能挺好玩,就是可以模拟教练员的身份, ...

  7. Android CoordinatorLayout 自定义Behavior 高仿美团商家详情界面 实现页面内容复杂联动效果

    内容如题 效果如下 顺带涉及到: Scroller+Handler 实现View自动滑动 View属性动画 触摸事件分发机制 ConstraintLayout约束布局 emmmm 实现参考: Cons ...

  8. Jetpack Compose自定义view 画月亮

    首先利用drawArc函数画扇形 月亮由有个圆个一个小圆组成 设置大圆心角为120° 360-120 = 240 startAngle = 40F,sweepAngle = 240f, 偏移40°增强 ...

  9. Jetpack Compose自定义绘测 画太阳

    要调用Canvas()的绘测方法 `drawCircle方法:绘制圆形 fun drawCircle(color: Color,radius: Float 圆的半径,center: Offset = ...

最新文章

  1. 如何分割字符串以便可以访问项目x?
  2. 五十七、Vue中的八大生命周期函数
  3. 从2021年多篇顶会论文看OOD泛化新理论、新方法和新讨论
  4. spring学习(14):Autowired的使用场景
  5. vaps 程序直接通信
  6. Linux下获取文件编译的时间
  7. 郭台铭卸任董事长 鸿海进入集体领导时代
  8. 元气骑士机器人旁边建筑_元气骑士机器人的一些经验
  9. csdn下载码怎么用?
  10. 实践三 网络嗅探与协议分析
  11. 白盒测试技术——语句覆盖、判定覆盖、条件覆盖
  12. 实验:高次插值的龙格现象(Runge)实验
  13. Java数据结构与算法 一
  14. 华为服务器文件升级失败,升级连接服务器失败
  15. Linux报错:-bash: 路径xx: No such file or directory解决方法
  16. Altium Designer 14.1.5 Build 30772
  17. 恢复foxmail中丢失的地址簿
  18. 《从0到1》读书笔记第4章“竞争意识”第2记:一块猪肉引发的竞争论
  19. Python实现冰雹猜想(折线图)
  20. MacBook苹果电脑绕过BootCamp安装Win10双系统

热门文章

  1. 写的非常不错的一篇阻塞与非阻塞、同步与异步套接字之间的区别
  2. html5 手机站点,HTML5移动端手机网站基本模板 HTML5基本结构
  3. 排队论和对策论(博弈论)
  4. ASAM让你减肥成为一种乐趣
  5. HTML创建表格及合并单元格
  6. 排列组合思维导图_Xmind 进阶教程|高级感满满的思维导图都在使用的6个技巧。...
  7. 制作自己的ChatGPT
  8. 关于苹果的iOS cercertificate的创建问题
  9. 如何删除Word文档中表格最后一行多出的空白页
  10. 网络正常连接,浏览器无法访问网络