ImageView 超过父 android studio xml

Posted

技术标签:

【中文标题】ImageView 超过父 android studio xml【英文标题】:ImageView exceeds parent android studio xml 【发布时间】:2019-11-10 16:08:39 【问题描述】:

如何使子 ImageView 剪辑到其父级的边界?当我将 ImageView 作为子视图添加到具有圆角的父视图时,子 ImageView 不符合圆角。

我试过了:android:cropToPaddingandroid:clipChildrenandroid:clipToPaddingandroid:adjustViewBounds

我已在图像视图和父视图以及所有可能的组合上将这些设置为 true 和 false。

我有一个自定义视图:custom_view.xml 用于圆角

<shape android:shape="rectangle">
  <corners android:backgroundTint="@color/backgroundColor" android:radius="10dp" />
  <solid android:color="@color/backgroundBlue" />
</shape>

我有一个片段,fragment_card.xml,它实现了自定义视图。

<android.support.constraint.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:id="@+id/card_view"
    android:layout_
    android:layout_
    android:layout_margin="10dp"
    android:background="@drawable/custom_view"   <-- setting the custom_view
    app:cardBackgroundColor="@color/colorAccent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <ImageView
        android:id="@+id/cardIconView"
        android:layout_
        android:layout_
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@id/line_separator"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
and it continues...

子 ImageView 不会剪辑到具有自定义背景的父视图的边界。注意左角不是圆角

CardListAdapter

override fun onBindViewHolder(holder: CardViewHolder, position: Int)  
  holder.cardIconView.setImageDrawable(theimage)

【问题讨论】:

【参考方案1】:

因此,您的问题在这里发生了一些误解。我要解决的第一件事是您的假设:

“当我将 ImageView 作为子视图添加到具有圆角的父视图时,子 ImageView 不符合圆角。”

您的子视图实际上是在尊重父视图的边界。圆角不是View 的边界,而是View 内的drawable 的剪辑。您所说的自定义视图,custom_view.xml 文件实际上是一个自定义可绘制对象,用作父级的背景。它对ConstraintLayout 的边界没有影响。

如果您希望您的图像也有圆角,我建议您查找有关剪辑ImageView 源的教程。谷歌搜索可以找到几个简单的教程,包括 Romain Guy 的一个,以及 Medium 上的几个,它们可以为您解决问题。

回顾一下:你的子视图实际上是在尊重父视图的边界,你应用到视图的背景实际上并不是父视图的边界,只是一个可作为背景的可绘制对象。父视图。因此,您需要对图像执行某种类型的遮罩或剪辑,或者构建一个自定义的 ImageView 类来自动剪辑其内容。

【讨论】:

也许你可以给出一个真正的解决方案,我需要类似于 OP 的东西 我不确定您所说的真正解决方案是什么意思?我提供了上下文来解释 OP 的问题/假设中的误解,然后提供了解决它的方向。我没有编写任何代码,因为在 Google 上已经有一份关于裁剪图像视图的详尽资源列表,而且我不会链接到特定的教程,因为我不想推广特定的资源。虽然我确实提到了 Romain Guy,因为他接近成为 Google 的第一方来源,但他的教程已经过时,并且不想硬链接到它。 我的意思是编辑您的答案并添加一个解决方案,因为我看到的所有关于此的 SO 问题都没有有效的解决方案。 如果你只是在 google 上搜索,有很多工作教程和 OSL 可用于制作圆形图像视图。 当然。没关系。然而,虽然缺乏研究,但对提问者的假设也缺乏理解,而这个答案是对这些误解的回答。【参考方案2】:

您可以创建另一个 left_corner.xml 并将其应用于子 ImageView,试试这个:

    <shape android:shape="rectangle">
      <corners android:backgroundTint="@color/backgroundColor" android:bottomLeftRadius="10dp" android:topLeftRadius="10dp" android:bottomRightRadius="0dp" android:topRightRadius="0dp" />
      <solid android:color="@color/backgroundBlue" />
    </shape>

希望对你有帮助。

【讨论】:

这不起作用。如果设置 ImageView 的 background="@drawable/left_corner.xml"src="@drawable/the_icon" 则不起作用。你试过这个并让它以某种方式工作吗?【参考方案3】:

ImageView 实际上满足了您设置的约束。那是因为父级的边界不会改变。 这是一个解决方案:在 ImageView 中包含一个边距,并结合match_parent 宽度和高度,以使其适合圆形父级,并在两侧留下一点边框。使用边距尺寸(以 dp 为单位),直到获得所需的内容。

【讨论】:

并不是人们真正需要的......在一种屏幕尺寸中使用维度会使其在另一种屏幕尺寸中看起来很糟糕。 完全不是我需要的。通过说“ImageView 实际上满足您设置的约束”是没有用的。这与问题无关。如果您找到了解决方案,请发布代码 sn-p 和显示您的解决方案的屏幕截图。 @jungledev 您说:子 ImageView 不会剪辑到具有自定义背景的父视图的边界。 Raaaaac 刚刚声明自定义背景不会剪切子视图。 我不是说他错了。我是说这不是 answer 因此不是我需要的...我 需要 是圆角图标,而不是缩小方形图标这样它就适合父母的圆角。

以上是关于ImageView 超过父 android studio xml的主要内容,如果未能解决你的问题,请参考以下文章

将快餐栏中的 ImageView 宽度与 Android 中的自定义视图匹配父项不起作用

ImageView不会在同一父布局中的recyclerView上方显示

Android总结 - ImageView

Android ImageView的scaleType属性与adjustViewBounds属性

Android课程---Android ImageView的scaleType属性与adjustViewBounds属性(转)

Android imageview不尊重maxWidth?