【问题标题】:How to convert android:radius in xml to float value in Kotlin Android如何将 xml 中的 android:radius 转换为 Kotlin Android 中的浮点值
【发布时间】:2019-09-21 23:46:52
【问题描述】:

我有一个可绘制的背景 xml 文件,如下所示,我将视图的半径设置为 40dp:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid
        android:color="@color/jungleGreen"/>
    <corners
        android:bottomLeftRadius="40dp"
        android:topLeftRadius="40dp"/>
</shape>

出于几个特定原因,我需要在 Kotlin Android 中以编程方式执行相同的操作。所以我写了一个如下的函数来做到这一点:

private fun setupGraphBackground(view: View) {
        val gradientDrawable = GradientDrawable()
        gradientDrawable.shape = GradientDrawable.RECTANGLE
        gradientDrawable.setColor(resources.getColor(R.color.jungleGreen))
        gradientDrawable.setStroke(0, null)
        gradientDrawable.cornerRadii = floatArrayOf(45f, 45f, 0f, 0f, 0f, 0f, 45f, 45f)
        view.background = gradientDrawable
    }

基本上,我发现如果我将函数中的值设置为 45f,它可能会与 xml 文件中的 40dp 一样接近。

我的问题是,是否有任何规则可以将其转换为完全正确的数字?好像哪里都没有文档。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: android android-layout kotlin cornerradius


    【解决方案1】:

    您以编程方式设置的任何值都被视为像素。您实际上应该将您想要的 dp 值转换为像素。你可以用这个方法

    fun dpToPx(context: Context, dp: Float): Float {
        return dp * (context.resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)
    }
    

    并像这样使用它

    private fun setupGraphBackground(view: View) {
        val gradientDrawable = GradientDrawable()
        val rad = dpToPx(context, 40f)
        gradientDrawable.shape = GradientDrawable.RECTANGLE
        gradientDrawable.setColor(resources.getColor(R.color.jungleGreen))
        gradientDrawable.setStroke(0, null)
        gradientDrawable.cornerRadii = floatArrayOf(rad, rad, 0f, 0f, 0f, 0f, rad, rad)
        view.background = gradientDrawable
    }
    

    您还可以创建一个UIUtils 类并将此方法添加到一个伴生对象中,以便您可以从任何需要的地方调用它。

    【讨论】:

    • 感谢您的回答,只是为了澄清最后一件事:所以我们放在cornerRadii 内的数字是以像素为单位的?因为我看到您的解决方案是将 xml 中的 dp 转换为像素?干杯,
    • @LongDao 所以基本上你在cornerRadii中输入的任何值都将被视为一个像素。我会更新我的答案应该如何使用这个方法
    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 2019-05-09
    • 2013-05-03
    • 2022-10-29
    • 1970-01-01
    • 2012-11-16
    • 2017-12-21
    • 1970-01-01
    相关资源
    最近更新 更多