Badge Drawable 正在从视图中剪切,并且没有以正确的方式显示 Android Kotlin

Posted

技术标签:

【中文标题】Badge Drawable 正在从视图中剪切,并且没有以正确的方式显示 Android Kotlin【英文标题】:Badge Drawable is cutting from view and not showing proper way Android Kotlin 【发布时间】:2021-12-06 19:08:43 【问题描述】:

嘿,我想展示可绘制的徽章。我尝试了这里的代码Does BadgeDrawable not work for views within a FrameLayout such as buttons, images, textviews etc.?、BadgeDrawable does not appear on elements other than BottomNavigationView、Badge Drawable not showing。我成功展示了,但问题是从侧边切割。

<FrameLayout
    android:id="@+id/container"
    android:layout_
    android:layout_
    android:layout_gravity="center"
    android:layout_marginEnd="24dp"
    android:clipChildren="false"
    android:clipToPadding="false"
    android:paddingStart="6dp"
    android:paddingTop="4dp"
    android:paddingEnd="9dp"
    android:paddingBottom="4dp"
    app:layout_constraintBottom_toBottomOf="@+id/xyz"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="@+id/xyz">

         <ImageView
             android:id="@+id/icon"
             android:layout_
             android:layout_
             android:layout_gravity="start"
             android:src="@drawable/ic_settings"
             tools:ignore="ContentDescription" />

</FrameLayout>

activity.kt

fun addBadgeDrawable(count: Int, target: View, parent: FrameLayout, context: Context) 
        target.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener 
            override fun onGlobalLayout() 
                val badgeDrawable = BadgeDrawable.create(context)
                badgeDrawable.number = count
                badgeDrawable.badgeGravity = BadgeDrawable.TOP_END
                badgeDrawable.setBoundsFor(target, parent)
                parent.foreground = badgeDrawable
                target.viewTreeObserver.removeOnGlobalLayoutListener(this)
            
        )
    

    private fun BadgeDrawable.setBoundsFor(@NonNull anchor: View, @NonNull parent: FrameLayout) 
        val rect = Rect()
        parent.getDrawingRect(rect)
        this.bounds = rect
        this.updateBadgeCoordinates(anchor, parent)
    

我正在设置徽章查看此代码行

addBadgeDrawable(10, binding.icon, binding.container, context)

输出

预期输出

【问题讨论】:

【参考方案1】:

为避免裁剪,需要在FrameLayout中增加paddingTop和paddingEnd。 或者可能需要添加额外的 ConstraintLayout 作为 FrameLayout 的父级,并使用约束和填充。

希望这对某人有所帮助。

【讨论】:

以上是关于Badge Drawable 正在从视图中剪切,并且没有以正确的方式显示 Android Kotlin的主要内容,如果未能解决你的问题,请参考以下文章

如何根据sqlite数据库中的名称从drawable中获取图像,然后在列表视图中显示

在recycleview时间轴中为每个视图添加drawable

视图的路径和形状

从android中的视图中剪切一个形状

Textview drawable 不在远程视图中显示可绘制图像

如何从可绘制文件夹上的图像获取路径并设置为图像视图,位图?