如何将xml中的android:radius转换为Kotlin Android中的浮点值

Long Dao

我有一个如下所示的可绘制背景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。

我的问题是,是否有任何规则将其转换为正确的数字?似乎哪里都没有文档。

任何帮助,将不胜感激。

谢谢。

阿兰·谢罗扬(Aram Sheroyan)

您以编程方式设置的任何值都将被视为像素。实际上,您应该将所需的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类,并将此方法添加到随播对象中,以便可以在任何需要的地方调用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章