Android: 有没有一种简单的方法可以为视图创建圆角而不必每次都创建一个单独的可绘制对象?

Android: Is there a simple way to create rounded corners for a view without having to create a separate drawable each time?

我在互联网上浏览了各种解决方案,这些解决方案使我们能够创建带圆角的视图。他们中的大多数需要使用创建自定义视图,或者每次我们需要圆角视图时在 xml 或九个补丁中创建一个可绘制对象。

问题是,当我实现这样的视图时,我需要为每个这样的视图创建一个可绘制对象,即使两个视图除了背景颜色之外什么都有。这让我有点恼火,我听说 iOS 框架提供了一种创建圆角视图的好方法。 任何帮助将不胜感激。

编辑:除了圆角,视图的压力效果和阴影也是常用的样式。请让您的解决方案包含这些影响。

如果你只是想改变背景的颜色,你可以使用backgroundTint

例如:


    <ImageView
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:background="@drawable/background"
        app:backgroundTint="#F00"
        />

请注意:我在这里使用 app:backgroundTint,通过使用 app 前缀,AppCompat 视图(AppCompatImageView、AppCompatButton 等)可以读取此属性并在 pre-lollipop Android 设备,但你应该确保你使用的是 appcompat 库。

万能解法:

转念一想,我想到了一个方法:可以创建一个LayoutInflater.Factory and replace all the views(imageView, TextView, etc) with your own custom view which takes corner radius and color as background, .

您可以通过编程方式为您的视图使用渐变可绘制对象,并且可以将该视图设置为背景

 GradientDrawable getRoundedCornerView(int shapetype,int color,float radius){
     GradientDrawable shape = new GradientDrawable();
     shape.setShape(shapetype); //GradientDrawable.RECTANGLE for rectangle
     shape.setColor(color);
     shape.setCornerRadius(radius);
retrun shape;
}

借助 Material 组件库,您可以使用 MaterialShapeDrawable to draw custom shapes

例如对于 TextView 你可以这样做:

    <TextView
        android:id="@+id/textview"
        android:backgroundTint="@color/secondaryColor"
        ../>

然后创建一个MaterialShapeDrawable:

float radius = getResources().getDimension(R.dimen.default_corner_radius);

TextView textView = findViewById(R.id.textview);
ShapeAppearanceModel shapeAppearanceModel = new ShapeAppearanceModel()
        .toBuilder()
        .setAllCorners(CornerFamily.ROUNDED,radius)
        .build();

MaterialShapeDrawable shapeDrawable = new MaterialShapeDrawable(shapeAppearanceModel);
ViewCompat.setBackground(textView,shapeDrawable);

用简单的View:

<View
    android:id="@+id/line"
    android:layout_width="match_parent"
    android:layout_height="4dp"
    android:backgroundTint="@color/..."/>

然后应用相同的 MaterialShapeDrawable:

View line = findViewById(R.id.line);
ViewCompat.setBackground(line,shapeDrawable);

您还可以创建不同的角:

ShapeAppearanceModel shapeAppearanceModel = new ShapeAppearanceModel()
    .toBuilder()
    .setAllCorners(CornerFamily.ROUNDED,0)
    .setBottomRightCorner(CornerFamily.ROUNDED,radius)
    .build();

此外,Material Component Library 提供的大多数组件都有一个 MaterialShapeDrawable 作为背景。
在这些情况下,只需使用类似的东西(在本例中为 MaterialCardView)。

  MaterialCardView cardView = findViewById(R.id.card);
  cardView.setShapeAppearanceModel(cardView.getShapeAppearanceModel()
        .toBuilder()
        .setBottomLeftCornerSize(...)
        .setBottomEdge(...)
        .build());

需要库的版本1.1.0。目前 1.1.0-beta02.