小编Thr*_*ian的帖子

Jetpack Compose 范围/智能重组

我正在做实验来理解重组和智能重组并制作了一个样本

\n

在此输入图像描述

\n

抱歉,颜色是用 Random.nextIn() 生成的,以便在视觉上观察重组,设置颜色对重组没有影响,也尝试不更改颜色。

\n

gif的内容由三部分组成

\n

样品1

\n
@Composable\nprivate fun Sample1() {\n\n    Column(\n        modifier = Modifier\n            .background(getRandomColor())\n            .fillMaxWidth()\n            .padding(4.dp)\n    ) {\n        var counter by remember { mutableStateOf(0) }\n\n\n        Text("Sample1", color = getRandomColor())\n\n        Button(\n            modifier = Modifier\n                .fillMaxWidth()\n                .padding(vertical = 4.dp),\n            colors = ButtonDefaults.buttonColors(backgroundColor = getRandomColor()),\n            onClick = {\n                counter++\n            }) {\n            Text("Counter: $counter", color = getRandomColor())\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我在这里没有问题,因为智能组合按预期工作,Text最重要的是不读取更改,counter因此重组仅发生在Textinside Button

\n

样品2

\n
@Composable\nprivate fun Sample2() {\n    Column(\n        modifier …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-compose compose-recomposition

16
推荐指数
1
解决办法
7253
查看次数

Jetpack Compose SubcomposeLayout 如何工作?

在官方文档中可以看到有一个名为 SubcomposeLayout 的布局定义为

布局的模拟,允许在测量阶段对实际内容进行细分,例如使用测量期间计算的值作为子项组成的参数。

可能的用例:

您需要知道在组合过程中父级传递的约束,并且无法仅使用自定义 Layout 或 LayoutModifier 来解决您的用例。请参阅 androidx.compose.foundation.layout.BoxWithConstraints。

您希望在构建第二个子项时使用第一个子项的大小。

您想根据可用尺寸懒惰地组合您的项目。例如,您有一个包含 100 个项目的列表,您不必组合所有项目,而是只组合当前可见的项目(例如其中 5 个),并在组件滚动时组合下一个项目。

我用SubcomposeLayout关键字搜索了 Stackoverflow,但找不到任何相关内容,创建了这个示例代码,从官方文档中复制了大部分代码,以测试和了解它是如何工作的

@Composable
private fun SampleContent() {

    Column(
        modifier = Modifier
            .fillMaxSize()
            .verticalScroll(rememberScrollState())
    ) {
        SubComponent(
            mainContent = {
                Text(
                    "MainContent",
                    modifier = Modifier
                        .background(Color(0xffF44336))
                        .height(60.dp),
                    color = Color.White
                )
            },
            dependentContent = {
                val size = it

                println(" Dependent size: $size")
                Column() {

                    Text(
                        "Dependent Content",
                        modifier = Modifier
                            .background(Color(0xff9C27B0)),
                        color = Color.White
                    )
                }
            }
        )

    }
} …
Run Code Online (Sandbox Code Playgroud)

android android-jetpack-compose

13
推荐指数
2
解决办法
2万
查看次数

Jetpack Compose 如何创建具有特定尺寸和配置的 ImageBitmap?

ImageBitmap 加载和图像

ImageBitmap.imageResource(
        LocalContext.current.resources,
        R.drawable.landscape1
    )
Run Code Online (Sandbox Code Playgroud)

还有一个可以使用一些参数调用的函数

ImageBitmap(
        width = 300,
        height = 300,
        config = ImageBitmapConfig.Argb8888,
        hasAlpha = true,
        colorSpace = ColorSpaces.Srgb
    )
Run Code Online (Sandbox Code Playgroud)

它返回没有像素数据的空位图,是否可以使用某些特定配置创建 imageBitMap ?

有类似 ImageBitmap 的东西吗?

val option = BitmapFactory.Options()
option.inPreferredConfig = Bitmap.Config.ARGB_8888
val bitmap: Bitmap = BitmapFactory.decodeResource(
    LocalContext.current.resources,
    R.drawable.landscape1,
    option
)
Run Code Online (Sandbox Code Playgroud)

android android-jetpack-compose

12
推荐指数
1
解决办法
1万
查看次数

如何使用触摸事件在 Jetpack Compose Canvas 上绘图?

这是问答式的问题,因为我正在寻找使用 Jetpack Canvas 的绘图示例,但在 stackoverflow 上有问题,这个另一个,我发现可以使用pointerInteropFilter像 View 那样的绘图onTouchEvent MotionEvent,根据文档,这是不建议的

一个特殊的 PointerInputModifier,提供对最初调度到 Compose 的底层 MotionEvent 的访问。优先选择pointerInput ,并且仅将其用于与使用MotionEvents 的现有代码的互操作。

虽然此修饰符的主要目的是允许任意代码访问分派给 Compose 的原始 MotionEvent,但为了完整性,提供了类似物以允许任意代码与系统交互,就好像它是 Android 视图一样。

android android-jetpack-compose android-jetpack-compose-canvas

11
推荐指数
1
解决办法
5424
查看次数

结合 detectorTapGestures 和 detectorDragGesturesAfterLongPress?

我们需要能够在长按 Jetpack Compose 中的同一组件后检测到点击和拖动手势。

要检测点击,我们可以这样做:

Modifier.pointerInput(graphData) {
    detectTapGestures(
        ...
    )
}
Run Code Online (Sandbox Code Playgroud)

并检测长按后的拖动手势:

Modifier.pointerInput(graphData) {
    detectDragGesturesAfterLongPress(
        ...
    )
}
Run Code Online (Sandbox Code Playgroud)

但不可能同时使用两者,因为第一个detect*将消耗指针事件:

Modifier.pointerInput(graphData) {
    detectTapGestures(
        ...
    )
    detectDragGesturesAfterLongPress(
        ...
    )
}
Run Code Online (Sandbox Code Playgroud)

是否有可能以更方便的方式实现这一点,然后滚动我们自己的自定义函数来复制 detectorDragGesturesAfterLongPress 中的大部分代码?

android kotlin android-jetpack-compose android-jetpack-compose-gesture

11
推荐指数
1
解决办法
2169
查看次数

翻译Android strings.xml文件的最简单方法

我正在使用Google翻译将strings.xml文件翻译成其他语言的英语.但是逐个翻译1000多行需要花费太多时间.有没有简单的方法或代码来做到这一点?

如何将您的应用翻译成其他语言?

android google-translate

10
推荐指数
1
解决办法
1万
查看次数

Jetpack Compose Text 超链接文本的某些部分

如何将超链接添加到 Text 组件文本的某些部分?

随着buildAnnotatedString我可以设置链接部分蓝色并带有下划线,如下面的图像,但我怎么也可以把这一节变成链接?

在此处输入图片说明

   val annotatedLinkString = buildAnnotatedString {
        val str = "Click this link to go to web site"
        val startIndex = str.indexOf("link")
        val endIndex = startIndex + 4
        append(str)
        addStyle(
            style = SpanStyle(
                color = Color(0xff64B5F6),
                textDecoration = TextDecoration.Underline
            ), start = startIndex, end = endIndex
        )
    }

    Text(
        modifier = modifier
            .padding(16.dp)
            .fillMaxWidth(),
        text = annotatedLinkString
    )
Run Code Online (Sandbox Code Playgroud)

我也可以,Spanned但有什么方法可以使用它Text吗?

val str: Spanned = HtmlCompat.fromHtml(
    "<a href=\"http://www.github.com\">Github</a>", HtmlCompat.FROM_HTML_MODE_LEGACY
)
Run Code Online (Sandbox Code Playgroud)

android android-jetpack-compose android-jetpack-compose-text

10
推荐指数
8
解决办法
2503
查看次数

Jetpack Compose 带有 CircleShape 的动态文本大小的自定义徽章未正确绘制

我有一个使用 onMeasure、onLayout 和 OnDraw 用 View 编写的 BadgeView

在此输入图像描述

我正在尝试将此视图迁移到 Jetpack Compose。

由于使用 compose 绘制形状更容易,我认为根本不需要使用画布或Layout函数,但是在计算文本大小之前,文本或表面环绕的大小没有正确设置,并且圆形没有正确绘制。

还检查了徽章组件,它使用静态尺寸BadgeWithContentRadius,因为在我的设计中尺寸取决于文本尺寸,所以不可能设置静态尺寸。

Surface(
    shape = CircleShape,
    contentColor = Color.White,
    color = Color.Red
) {
    Text(
        text = "0",
        modifier = Modifier.padding(4.dp),
        fontSize = 34.sp,
    )
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然后尝试使用

var size: Dp by remember { mutableStateOf(40.dp) }

val density = LocalDensity.current

Surface(
    shape = CircleShape,
    modifier = Modifier.size(size),
    contentColor = Color.Yellow,
    color = Color.Red
){
    Text(
        text = "0",
        modifier = Modifier.padding(4.dp),
        fontSize …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-compose

10
推荐指数
1
解决办法
4097
查看次数

协程测试异常既不使用 TestCoroutineDispatcher 也不使用 TestCoroutineScope 处理

使用本手册来测试协程。编写预期抛出异常的测试会导致崩溃,而不是通过测试。我想知道我做错了什么。

    private val testDispatcher = TestCoroutineDispatcher()

    @Before
    fun setup() {
        // provide the scope explicitly, in this example using a constructor parameter
        Dispatchers.setMain(testDispatcher)
    }

    @After
    fun cleanUp() {
        Dispatchers.resetMain()
        testDispatcher.cleanupTestCoroutines()
    }

    @Test(expected = RuntimeException::class)
    fun testSomeFunctionWithException() = testDispatcher.runBlockingTest {
        someFunctionWithException()
    }


    private fun someFunctionWithException() {
        MainScope().launch {
            throw RuntimeException("Failed via TEST exception")
        }
    }
Run Code Online (Sandbox Code Playgroud)

测试方法见上、下

    private val testScope = TestCoroutineScope()
    private lateinit var subject: Subject

    @Before
    fun setup() {
        // provide the scope explicitly, in this example using …
Run Code Online (Sandbox Code Playgroud)

unit-testing kotlin kotlin-coroutines

9
推荐指数
1
解决办法
6856
查看次数

Jetpack Compose TextField 是否存在辅助文本、错误消息、字符计数器?

在材料设计中TextField 页面 TextField具有以下属性

在此输入图像描述

辅助元素提供有关在文本字段中输入的文本的更多详细信息。

  1. 帮助文本 帮助文本传达有关输入字段的附加指导,例如如何使用它。它应该只占据一行,持续可见或仅在焦点上可见。

  2. 错误消息 当不接受文本输入时,错误消息会显示有关如何修复它的说明。错误消息显示在输入行下方,替换帮助文本直到修复。

  3. 图标 图标也可用于发送警报消息。将它们与错误消息配对以提供冗余警报,这在您需要为色盲用户进行设计时非常有用。

  4. 字符计数器 如果存在字符或字数限制,则应使用字符或字数计数器。它们显示所用字符的比率和总字符限制。

Jetpack Compose TextField截至目前,这些属性是否存在compose 1.0.0-alpha09

android android-jetpack-compose android-compose-textfield

9
推荐指数
1
解决办法
3195
查看次数