使用 setClipToOutline 时如何使 ImageView 的角为圆角和边框

Posted

技术标签:

【中文标题】使用 setClipToOutline 时如何使 ImageView 的角为圆角和边框【英文标题】:How to have an ImageView with corners rounded and bordered while using setClipToOutline 【发布时间】:2020-06-09 20:48:57 【问题描述】:

跟进this answer,我怎样才能实现相同的效果,但包括一个在剪裁的ImageView 周围平滑运行的边框。

我尝试将其用作带有红色边框的ImageViewimageView.setClipToOutline(true) 的背景可绘制对象。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@android:color/transparent" />
    <corners
        android:radius="35" />
    <stroke
        android:
        android:color="#E42323" />
    <padding
        android:bottom="2dp"
        android:left="2dp"
        android:right="2dp"
        android:top="2dp" />
</shape>

当不使用图像时Android:src it works fine.

但是当我使用Android:src the borders are clipped as well.

注意:我知道可以使用FrameLayoutImageView 作为孩子并将背景可绘制设置为FrameLayout 但that's just asking for issues。

【问题讨论】:

你尝试过使用两个图像吗?首先是带有盘子的图像,其次是带有圆形边框的图像 @FranciscoBarrios 您的建议与我上面所说的类似,我什至认为使用FrameLayout 而不是ImageView 来保持圆形边框更干净 【参考方案1】:

好的,我认为这不是您所期望的解决方案,但由于没有简单的解决方案,因此如果 API 级别 >= 23,我可以找到一个有趣的解决方法,但由于它的工作原理我认为如果它对某人有帮助,我会分享它。

基本上,将相同的drawable设置为背景并将其设置为

android:foreground="@drawable/background"

您仍然需要设置背景以便setClipToOutline 正确剪切drawable,而前景将在外部创建重叠边框。

尽管前台使用了FrameLayout,但由于它对于相同的ImageView 没有发现任何动画问题,它们似乎可以正常工作。

【讨论】:

可以确认,这个解决方案确实有效,还没有测试动画,但它应该没问题,但它仍然有两个警告,一个是它需要 API >= 23,另一个是如果一个已经在使用前景可绘制对象,则必须对其进行编辑以使其具有与背景可绘制文件相同的形状 @EvilNeo 不知何故我还没有注意到你的评论。是的,正如您提到的 API>=23 是一个限制,但关于前景,它可以是任何与背景相同的东西。但是setClipToOutline 剪辑基于背景帧,因此设置更大尺寸的前景会使其移动到剪辑的图像视图之外,但较小的可以。由于圆角的边框是要求,因此建议两者都相同。

以上是关于使用 setClipToOutline 时如何使 ImageView 的角为圆角和边框的主要内容,如果未能解决你的问题,请参考以下文章

使用绑定时如何使子 NSManagedObjectContext 保持最新

在片段中使用 CoordinatorLayout 时如何使状态栏透明

更改密码时如何使 OAuth 令牌无效?

使用 NAudio 使用 asioout 录制时如何使声音更大?

使用 smoothScrollToPosition() 函数时如何使 ListView 的滚动变慢?

使用 MVVM 时,如何使 TextBox 成为“密码框”并显示星星?