Android 圆角 - XML 与 Java 版本

Android Rounded Corners - XML vs Java version

我们在某些布局中需要圆角,我们想出了两种方法。尽管这两种方法都运行良好,但结果略有不同,我想在这里获得一些关于不同行为的见解。

第一种方法是使用XML.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="#e1d6a6" />
    <corners android:radius="9dp" />
</shape>

这行得通。然而,XML 方法的问题是颜色和半径是固定的,我们需要创建重复的可绘制对象来更改任何参数。所以我们想出了 Java 版本,它非常灵活并且工作起来很有魅力,尽管结果略有不同。下面是 java 版本

void setRoundedCorners(View view, int color, float radius) {
    GradientDrawable drawable = new GradientDrawable();
    drawable.setColor(color);
    drawable.setCornerRadius(radius);
    view.setBackground(drawable);
}

虽然这两种方法都工作正常,但都需要不同的半径参数值才能获得相同的效果。例如,如果我在XML版本中使用android:radius="9dp",我需要在Java中使用setCornerRadius(30.0f)才能获得几乎相同的效果。

所以我想了解使用 Java 方法的任何缺点,以及 xml 中的 9dp 如何转换为 java 中不同设备的 setCornerRadius 参数。有什么见解吗?

谢谢

setCornerRadiusfloat 值视为像素。您可以根据设备屏幕密度和尺寸

dp 值转换为 px 来为此函数提供相同的值 9dp

下一行为您提供 9dp

的等效像素值
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 9, context.getResources().getDisplayMetrics());

尽管使用 XML 可以提供出色的性能,但后台框架会执行此转换以在每个设备上显示相同的结果。