Как конвертировать Android: радиус в XML для плавающего значения в Android Kotlin - PullRequest
1 голос
/ 22 сентября 2019

У меня есть фоновый 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, оно будет примерно равным 40dp в XML-файле.

Мой вопрос заключается в том, есть ли какие-либо правила для преобразования его в точное число?Кажется, что нигде нет документации.

Любая помощь будет оценена.

Спасибо.

1 Ответ

2 голосов
/ 22 сентября 2019

Любое значение, которое вы устанавливаете программно, обрабатывается как пиксель.Вы должны конвертировать значение 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 и добавить этот метод внутри объекта-компаньона, чтобы вы могли вызывать егооткуда угодно.

...