首页 > 解决方案 > View.setPadding 影响背景 ShapeDrawable 填充

问题描述

我有一个带有背景可绘制的自定义视图。

可绘制对象具有带填充的内部形状。视图本身没有应用填充

每当我使用View.setPadding(left,top,right,bottom)以编程方式在视图上设置填充时,形状填充也会发生变化,老实说,我不知道为什么。

xml定义如下:

背景可绘制

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="?android:attr/colorControlHighlight">
    <item>
        <shape android:shape="rectangle">
            <corners android:radius="@dimen/radius_large" />
            <solid android:color="@color/yellow" />
            <padding
                    android:left="@dimen/spacing_large"
                    android:right="@dimen/spacing_large"
                    android:top="@dimen/spacing_medium_to_large"
                    android:bottom="@dimen/spacing_medium_to_large" />
        </shape>
    </item>
</ripple>

扩展 ConstraintLayout 的自定义视图 (已编辑)

tools: attrs标签上的<merge>仅用于呈现布局预览中的结果。如您所知,<merge>它不是视图组,因此它不允许背景等属性

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:tools="http://schemas.android.com/tools"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"
        tools:background="@drawable/background_start_lesson"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <ImageView
            ... />

    <ImageView
            ... />

    <TextView
            ... />


</merge>

在我的自定义视图的构造函数中,我只需设置R.drawable.background_start_lesson

当然,这只是像预期的那样很好地渲染,带有大填充:

在形状上设置填充的自定义视图

.....但是如果我只是以编程方式或通过xml将视图本身的填充设置为0dp (并且它应该已经在0dp,因为我在视图上没有指定!),这就是发生的事情:

以编程方式设置 0dp 填充的自定义视图

总之,为什么 setPadding() 改变了<shape>可绘制的填充而不是视图的填充

标签: androidandroid-viewpaddingandroid-backgroundandroid-shapedrawable

解决方案


推荐阅读