是否可以在 Android 可绘制对象中将圆角半径指定为百分比?

gfr*_*ng4 9 android android-xml android-drawable

作为 Android 可绘制对象,它代表一个带圆角的黑色矩形。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="20dp" />
    <solid android:color="#000000" />
</shape>
Run Code Online (Sandbox Code Playgroud)

但是,角半径被指定为绝对值20dp,因此如果以不同的尺寸显示相同的可绘制对象,则其显示会有所不同。较小的形状不仅仅是较大形状的“缩小”版本。相反,它“更圆”,而较大的则“更方形”,因为20dp无论可绘制对象的大小如何,边框半径都是静态的。

绝对边界半径

我想指定相对于完整可绘制尺寸的半径,因此当以不同尺寸绘制时,每个尺寸都显示为其他尺寸的放大/缩小版本。

相对边界半径

我更熟悉 CSS,这可以用一行完成:

border-radius: 20%;
Run Code Online (Sandbox Code Playgroud)

我惊讶地发现 Android 缺乏这种 CSS 简单性。Android 无法识别%为一个单元。

<corners android:radius="20%" />
Run Code Online (Sandbox Code Playgroud)

有没有一些简单的方法可以在 Android 中实现我想要的结果?

小智 2

你是对的,没有内置的方法。但你可以通过编程来实现它。不久前我写了这个小课程,它对我有用

    public class CornerDrawable extends GradientDrawable {

    private float percent;

    @Override
    public void setBounds(int left, int top, int right, int bottom) {
        super.setBounds(left, top, right, bottom);
        setCornerRadius(getBounds().height() / percent);
    }

    @Override
    public void setBounds(@NonNull Rect bounds) {
        super.setBounds(bounds);
        setCornerRadius(getBounds().height() / percent);
    }

    /**
     * Sets the corner radius of each corner to the <code>percent</code> of the height of this drawable. For example, passing
     * <i>50</i> will result in a fully rounded side of the target view.
     *
     * @param percent The percentage of the height of the view to be rounded
     */
    public void setCornerRadiusPercent(float percent) {
        this.percent = 100 / percent;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你只需要创建一个实例并按照你想要的方式配置它并将其设置在你的目标视图上。例如这样:

    //the view you want to apply the corner radius to
    View targetView = ...
    CornerDrawable cornerDrawable = new CornerDrawable();
    //pass your desired percent value
    cornerDrawable.setCornerRadiusPercent(20);
    // set the solid color from your xml above
    cornerDrawable.setColor(getResources().getColor(R.color.black, requireContext().getTheme()));
    targetView.setBackground(cornerDrawable);
Run Code Online (Sandbox Code Playgroud)

唯一的缺点是,您必须以编程方式完成所有配置,而不是使用可绘制的 xml 文件。