Jetpack Compose:如何创建评级栏?

2024-01-10

我正在尝试实施评级栏。我指的是https://gist.github.com/vitorprado/0ae4ad60c296aefafba4a157bb165e60 https://gist.github.com/vitorprado/0ae4ad60c296aefafba4a157bb165e60但我不明白这段代码中的任何内容。它有效,但当我使用此代码时,星星没有圆角。我想实现如下所示的东西:


我为此制作了非常基本的示例,它将给出创建带有示例边框和填充 png 文件的评级栏的基本想法。

@Composable
private fun RatingBar(
    modifier: Modifier = Modifier,
    rating: Float,
    spaceBetween: Dp = 0.dp
) {

    val image = ImageBitmap.imageResource(id = R.drawable.star)
    val imageFull = ImageBitmap.imageResource(id = R.drawable.star_full)

    val totalCount = 5

    val height = LocalDensity.current.run { image.height.toDp() }
    val width = LocalDensity.current.run { image.width.toDp() }
    val space = LocalDensity.current.run { spaceBetween.toPx() }
    val totalWidth = width * totalCount + spaceBetween * (totalCount - 1)


    Box(
        modifier
            .width(totalWidth)
            .height(height)
            .drawBehind {
                drawRating(rating, image, imageFull, space)
            })
}

private fun DrawScope.drawRating(
    rating: Float,
    image: ImageBitmap,
    imageFull: ImageBitmap,
    space: Float
) {

    val totalCount = 5

    val imageWidth = image.width.toFloat()
    val imageHeight = size.height

    val reminder = rating - rating.toInt()
    val ratingInt = (rating - reminder).toInt()

    for (i in 0 until totalCount) {

        val start = imageWidth * i + space * i

        drawImage(
            image = image,
            topLeft = Offset(start, 0f)
        )
    }

    drawWithLayer {
        for (i in 0 until totalCount) {
            val start = imageWidth * i + space * i
            // Destination
            drawImage(
                image = imageFull,
                topLeft = Offset(start, 0f)
            )
        }

        val end = imageWidth * totalCount + space * (totalCount - 1)
        val start = rating * imageWidth + ratingInt * space
        val size = end - start

        // Source
        drawRect(
            Color.Transparent,
            topLeft = Offset(start, 0f),
            size = Size(size, height = imageHeight),
            blendMode = BlendMode.SrcIn
        )
    }
}

private fun DrawScope.drawWithLayer(block: DrawScope.() -> Unit) {
    with(drawContext.canvas.nativeCanvas) {
        val checkPoint = saveLayer(null, null)
        block()
        restoreToCount(checkPoint)
    }
}

Usage

Column {
    RatingBar(rating = 3.7f, spaceBetween = 3.dp)
    RatingBar(rating = 2.5f, spaceBetween = 2.dp)
    RatingBar(rating = 4.5f, spaceBetween = 2.dp)
    RatingBar(rating = 1.3f, spaceBetween = 4.dp)
}

Result

还创建了一个使用手势、其他 png 文件和矢量作为评级项目的库here https://github.com/SmartToolFactory/Compose-RatingBar.

@Composable
fun RatingBar(
  modifier: Modifier = Modifier,
  rating: Float,
  painterEmpty: Painter,
  painterFilled: Painter,
  tintEmpty: Color? = DefaultColor,
  tintFilled: Color? = null,
  itemSize: Dp = Dp.Unspecified,
  rateChangeMode: RateChangeMode = RateChangeMode.AnimatedChange(),
  gestureMode: GestureMode = GestureMode.DragAndTouch,
  shimmer: Shimmer? = null,
  itemCount: Int = 5,
  space: Dp = 0.dp,
  ratingInterval: RatingInterval = RatingInterval.Unconstrained,
  allowZeroRating: Boolean = true,
  onRatingChangeFinished: ((Float) -> Unit)? = null,
  onRatingChange: (Float) -> Unit
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jetpack Compose:如何创建评级栏? 的相关文章

  • 在 Android 上使用 AT 命令与调制解调器对话

    我试图与三星 Galaxy s2 plus 和华为 p1 xl u9200 调制解调器发送 AT 命令 但无法得到任何结果 我使用 adb shell 发送命令并使用 logcat 查看日志 在三星 当我执行 cat 时 proc tty
  • 如何在android中显示对话框之外的图像?

    我试图在对话框片段的顶部显示配置文件图像 一半在图像之外 我在下面附加了示例对话框 就像那样 并尝试了旧 Stackoverflow 解决方案中的所有 FrameLayout 协作 但我无法存档此内容 请给我正确的解决方案 谢谢 Updat
  • 在 ChromeO 上安装未知来源的 apk

    我今天早上更新了我的 Chromebook Asus Flip 以获取 Play 商店 我的 Chromebook 安装了 M53dev 通道版本 它运作良好 我可以安装并运行从 Play 商店下载的 Android 应用程序 我想测试我的
  • 使用 Fragment 在工具栏中实现 SearchView

    当前情况 我的应用程序主页由导航抽屉组成 因此我将视图作为片段加载 我的工具栏中也有搜索图标 我在中实现了它menu xml 下一步我实施了SearchView通过以下问题的答案来获取搜索图标在工具栏中实现搜索 https stackove
  • 当满足条件时,如何以编程方式更改 ImageButton src 目标?

    我有一个学校项目 我正在尝试开发一个手电筒应用程序 对于开 关 ImageButton 我想要 4 个自定义图像 如果手电筒关闭 turn on png 默认 turn on pressing png 按下状态 true 如果手电筒打开 t
  • 吉夫伦致命信号11

    我正在尝试使用一些本机代码来创建 Gif 我使用绘画绘制图像 创建一些笔画 单击 保存 绘制的图像将保存为 JPG 格式 当我单击 创建 Gif 时 它会获取所有图像并开始创建 gif 这是当我收到致命信号 11 并且应用程序重新启动时 我
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • Fragment 问题中的 ExpandableListView

    我正在尝试在片段中实现可扩展列表视图 没有错误出现 当我尝试记录两个的输出时List
  • ADB TCPIP 连接问题

    我有两台 Galaxy S3 其中一个已扎根 另一个则未扎根 因此 当我尝试通过本地网络连接它们时 计算机可以看到已root的计算机 但是正常的就卡在tcpip这一步了 所以 我写 adb tcpip 5555 It says restar
  • Ionic 2 RC0 和 Angular 2 最新的 Android 构建错误(ngc:错误:静态解析符号值时遇到错误)

    当我使用构建android时出现错误ionic build android命令 ngc 错误 静态解析符号值时遇到错误 引用本地 非导出 符号 字典 考虑导出符号 原始 ts文件中的位置14 8 解析符号TRANSLATION PROVID
  • React Native Expo StackNavigator 重叠通知栏

    我正在尝试为我的 React Native Expo 应用程序实现导航栏 这里有一个问题 dependencies expo 18 0 3 react 16 0 0 alpha 12 react native 0 45 1 react na
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • 在新的 intel x86 android 模拟器中访问 google api

    我只是尝试在新的 x86 android 模拟器中运行我公司的应用程序 但是我们的应用程序依赖于 google 地图 API 而这在 google 随 android sdk 版本 17 提供的 x86 系统映像中不可用 我的直觉告诉我答案
  • 在android中,将相机预览流到视图上

    我想将 Android 相机的相机预览流式传输到视图上 目的是随后使用 onDraw 将各种内容添加到视图中 我不需要随时实际捕捉图像 它不必是最高质量或每秒最大数量的帧 有谁知道如何做到这一点 将其添加到您的 xml 中
  • 如何将 Android 添加到 Phonegap 平台版本 3

    经过大量挖掘 我相信这个问题 https stackoverflow com questions 18423444 phonegap 3 doesnt work with andriod studio与我没有添加任何用于构建phonegap
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 无法使用 findViewById() 找到视图

    我找不到TextView通过致电findViewById 即使 ID 确实存在 OtherActivity public class OtherActivity extends Activity Override protected voi
  • 当目标小于 Android O 时,如何在 Android O 上创建快捷方式?

    背景 Android O 对快捷方式的工作方式进行了各种更改 https developer android com preview behavior changes html as https developer android com
  • 检查应用程序是否在 Android Market 上可用

    给定 Android 应用程序 ID 包名称 如何以编程方式检查该应用程序是否在 Android Market 上可用 例如 com rovio angrybirds 可用 而 com random app ibuilt 不可用 我计划从

随机推荐

  • 由于格式不正确,加载程序集失败

    我开发了一个相当大的 Windows Forms net C 应用程序 其中包含多个程序集 最初 每个程序集都是为目标平台 任何 CPU 构建的 由于 x64 机器上的 Crystal Reports 存在问题 我们必须为 x86 目标平台
  • 如何在react-quill中注册对齐样式

    我在用着反应鹅毛笔 https www npmjs com package react quillnpm 包并在 nextjs 中动态导入它 我还使用 create next app 样板 我能够让反应鹅毛笔编辑器工作 但是 我无法获取使用
  • 地理编码器 Gem 无法在生产环境中工作

    所以我正在使用Geocoder https github com alexreisner geocoder根据用户提交表单时提供的地址提取纬度和经度坐标 我这样做是为了使用 Google 地图 API 绘制标记 这在开发中非常有效 零问题
  • .NET 4.5 中是否已弃用 ObjectContext?

    我一直在使用ObjectContexts已经很长一段时间了 现在我已经安装了 VS 2012 令我惊讶的是 实体数据模型没有创建代码生成项的选项ObjectContexts and EntityObjects代替DbContexts and
  • Mongoose 在 Node.js 中创建多租户支持连接

    我正在研究一种使用 node js mongoose 和 mongodb 实现多数据库以支持多租户的好方法 我发现 mongoose 支持一种名为createConnection 我想知道使用它的最佳实践 实际上 我将所有这些连接存储在一个
  • 基于智能指针的 CRTP 习惯用法的编译问题

    我正在尝试为 CRTP 示例编译一个最小的工作示例这篇博文 https www fluentcpp com 2017 09 12 how to return a smart pointer and use covariance 它基于智能指
  • 如何将一些“统计数据”从 C# 程序传递到另一个程序?

    我有一个命令行程序 可以 做很多工作 并产生 很多统计数据 它是股票交易软件 对于延迟 错误等非常重要 所以我不想向其中添加 GUI 此外 有时需要 GUI 但控制台应用程序应始终启动 我需要 GUI 来友好地显示收集的统计信息 以只读模式
  • 降低无向图的时间复杂度

    我有一个无向图 表示 Facebook 等社交媒体中的用户连接 有N个节点 从1到N 边由数组 from 和 to 表示 任务数组表示我有兴趣查找该节点 即社交媒体中的用户 的连接的节点号 Example N 5 From 2 2 1 1
  • ASP.NET Core 中 HttpContext 如何响应 END

    我想使用mvcSystem Web HttpContext Current Response End 但尝试使用以下代码在 mvc core 2 中 private readonly IHttpContextAccessor httpCon
  • 如何找出哪个视图是焦点?

    我需要查明活动中是否有任何视图聚焦以及它是什么视图 这个怎么做 Call getCurrentFocus http developer android com reference android app Activity html getC
  • 如何用 sed 替换整行?

    假设我有一个包含行的文件 aaa bbb 现在我想将它们替换为 aaa xxx 我可以这样做 sed s aaa bbb aaa xxx g 现在我有一个包含几行的文件 如下所示 aaa bbb aaa ccc aaa ddd aaa so
  • Microsoft Azure Bot Framework 模拟器未发送消息

    在我的 Windows 10 上 我安装了Microsoft Azure Bot 框架模拟器 https learn microsoft com en us azure bot service bot service debug emula
  • 获取具有特定 fieldName 的所有 lucene 值

    解决this https stackoverflow com questions 618227 faster way to get distinct values from lucene query问题 我创建了一个新的 Lucene 索引
  • 如何从远程文件(Java)获取修改日期?

    我有一个从远程 URL 下载文件的功能 使用 Java 现在我想知道真正的修改日期 因为当我下载它时我丢失了此信息 提前致谢 public void downloadFile String remoteFile String localFi
  • setColorFilter 有时在 Android 可绘制对象上不起作用

    我正在尝试根据用户在偏好中选择的原色在可绘制对象上应用滤色器 这是我正在使用的一段代码 getResources getDrawable R drawable ic batman 1 setColorFilter ColorHelper g
  • argparse 和互斥组,每个组都有自己所需的设置

    我有一个程序需要有一个选项来测试服务器 ID 列表OR对服务器发出命令 这意味着 如果我发出 test 那么不需要其他任何东西 它对每台服务器运行全部测试并打印结果 但是 如果我不指定 test 那么它应该需要一些选项 例如 id and
  • 检查 SQLite 中是否存在列

    我需要检查列是否存在 如果不存在则添加它 根据我的研究 sqlite 似乎不支持 IF 语句 应该使用 case 语句 这是我到目前为止所拥有的 SELECT CASE WHEN exists select from qaqc column
  • 如何更新海燕窗口的名称?

    我正在尝试在保存事件后更新海燕窗口的名称 显示名称 我实现了自己的 NameInfo 类 该类继承自 NameInfo 抽象类 public class MyNameInfo NameInfo private string name str
  • Cckeditor 更新文本区域

    我正在尝试让 ckeditor 工作 显然它没有使用文本区域 因此提交表单时不会在编辑器中提交文本 因为我使用多态关联等 我无法创建 onsubmit 函数来获取 textarea 的值 当提交表单时 所以我发现了这个问题 使用 jQuer
  • Jetpack Compose:如何创建评级栏?

    我正在尝试实施评级栏 我指的是https gist github com vitorprado 0ae4ad60c296aefafba4a157bb165e60 https gist github com vitorprado 0ae4ad