将形状设置为 ImageView 背景以获得圆角

Posted

技术标签:

【中文标题】将形状设置为 ImageView 背景以获得圆角【英文标题】:Set shape as ImageView background to get top corners rounded 【发布时间】:2020-11-29 03:17:27 【问题描述】:

我正在尝试使用 ConstraintLayoutScrollView 内构建一个带有圆角的布局。 在布局的顶部,我想放置一个顶角圆角(以匹配布局角)和直角底角的图像。

按照我在this *** 问题中找到的建议,这是我的代码:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".MainActivity"
    android:orientation="vertical">

    <ScrollView
        android:id="@+id/scroll_layout"
        android:layout_
        android:layout_
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_weight="7.5"
        android:background="@color/darkModePrimary">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginTop="16dp"
            android:layout_
            android:background="@drawable/layout_bg"
            android:layout_>

            <ImageView
                android:background="@drawable/layout_bg"
                android:src="@drawable/house_medium"
                android:id="@+id/house_image"
                android:layout_
                android:layout_
                android:scaleType="fitXY"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>

            <TextView
                android:layout_marginTop="32dp"
                android:gravity="center"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@id/house_image"
                android:layout_
                android:layout_
                android:text="Some text"
                android:textSize="24sp"/>

        </androidx.constraintlayout.widget.ConstraintLayout>

    </ScrollView>

</androidx.constraintlayout.widget.ConstraintLayout>

这是我为 ConstraintLayout 的背景定义形状的 xml 文件

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@android:color/white"/>
    <corners android:radius="10dp"/>
    <padding
        android:left="0dp"
        android:top="0dp"
        android:right="0dp"
        android:bottom="0dp" />
</shape>

如果我将此形状设置为约束布局和 ImageView 的背景,我会得到 - 正如预期的那样 - 具有所有四个圆角的图像,如下所示。

我尝试创建另一个形状用作图像的背景,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@android:color/white"/>
    <corners android:bottomRightRadius="0dp"
        android:bottomLeftRadius="0dp"
        android:topLeftRadius="10dp"
        android:topRightRadius="10dp"/>
    <padding
        android:left="0dp"
        android:top="0dp"
        android:right="0dp"
        android:bottom="0dp"/>
</shape>

但是当我将它设置为 ImageView 的背景时,我没有得到我想要的,图像的所有四个角现在都是直的

我做错了什么?

【问题讨论】:

只需将卡片布局放入 CardView 中,然后更改 app:cardCornerRadius。 由于一系列原因,我决定不使用 CardViews 而是自己构建布局,所以很遗憾我不能这样做 ok,然后尝试添加 size 属性。 【参考方案1】:

要使其正常工作,只需在代码中为您的卡片容器布局设置大纲即可。

在布局 xml 中添加 id 到卡片容器:

  <androidx.constraintlayout.widget.ConstraintLayout
      android:id="@+id/card"
      android:layout_
      android:layout_
      android:layout_marginLeft="16dp"
      android:layout_marginTop="16dp"
      android:layout_marginRight="16dp"
      android:background="@drawable/layout_bg"
      android:elevation="4dp">

在您的 MainActivity onCreate 中:

override fun onCreate(savedInstanceState: Bundle?) 
     super.onCreate(savedInstanceState)
     setContentView(R.layout.activity_main)

     card.clipToOutline = true
     card.outlineProvider = ViewOutlineProvider.BACKGROUND

结果:

【讨论】:

以上是关于将形状设置为 ImageView 背景以获得圆角的主要内容,如果未能解决你的问题,请参考以下文章

Android 圆角、圆形 ImageView 实现

创建带圆角的 ImageView [重复]

ImageView 只有一个圆角

如何以编程方式圆角并设置随机背景颜色

iOS 设置图片imageView圆角——对图片进行裁剪

Flutter 问题系列第 49 篇在 Flutter 中如何给组件设置背景色圆角边框形状阴影渐变色背景图片等效果