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

Posted

技术标签:

【中文标题】Android:有没有一种简单的方法可以为视图创建圆角,而不必每次都创建单独的可绘制对象?【英文标题】:Android: Is there a simple way to create rounded corners for a view without having to create a separate drawable each time? 【发布时间】:2020-03-21 14:57:14 【问题描述】:

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

问题在于,当我实现这样的视图时,我需要为每个这样的视图创建一个可绘制对象,即使两个视图除了背景颜色之外的所有内容都有相同的内容。这对我来说有点烦人,我听说 ios 框架提供了一种创建圆角视图的好方法。 任何帮助将不胜感激。

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

【问题讨论】:

你试过CardView吗? 我做了,但这只是一个视图组,并不是解决这个问题的正确方法。 也许检查this android API 的答案> 21 您可以创建带有圆角的自定义图像视图并在任何您想要的地方使用它 @NehaRathore 我明白这一点,但我只是在寻找一种在所有视图中通用且方便的解决方案。另外,请指出一些链接来解释您如何简化此过程作为答案。非常感谢:) 【参考方案1】:

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

例如:


    <ImageView
        android:layout_
        android:layout_
        android:background="@drawable/background"
        app:backgroundTint="#F00"
        />

请注意:我在这里使用app:backgroundTint,通过使用app 前缀,AppCompat 视图(AppCompatImageView、AppCompatButton 等)可以读取此属性并在棒棒糖前的 Android 设备上为背景着色,但您应该使确保您使用的是 appcompat 库。

通用解决方案:

再想一想,我想出了一个方法:您可以创建一个LayoutInflater.Factory 并用您自己的自定义视图替换所有视图(imageView、TextView 等),该视图以角半径和颜色为背景,just like AppCompat library .

【讨论】:

您好 Zumi,我不确定背景色调如何有助于圆角。 好吧,你在你的问题中说“即使两个视图除了背景颜色之外什么都有”,所以我认为你所有的视图都将具有相同的半径但颜色不同。 然后你可以创建一个圆角drawable作为背景,并使用backgroundTint来控制视图的背景颜色。 哦,也许这会有所帮助。但是,当使用色调时,可能会完成一些 alpha 合成。谢谢。【参考方案2】:

您可以通过编程方式为您的视图使用 Gradient drawable,并将该视图设置为背景

 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;

【讨论】:

【参考方案3】:

借助材质组件库,您可以使用 MaterialShapeDrawable 到 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_
    android:layout_
    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

【讨论】:

谢谢,我觉得这是迄今为止最好的解决方案。我想你也可以通过这种方式添加阴影和新闻效果 @Harsha 我已经用shaping 的有用链接更新了答案。这里是 MaterialShapeDrawable 的 API。 这很好,请问您如何让自己了解在 android 上做事的各种方法?

以上是关于Android:有没有一种简单的方法可以为视图创建圆角,而不必每次都创建单独的可绘制对象?的主要内容,如果未能解决你的问题,请参考以下文章

为android studio的不同实例创建不同的主题

有没有一种简单的方法可以在 Android 上展平 json:api 响应?

有没有一种简单的方法可以从 CakePHP 的视图中获取 AuthComponent 用户数据?

将视图恢复到原始 xml 状态

如何在 Android 应用程序中阻止或改善横向视图

是否可以在android中屏蔽视图?