View.setPadding影响背景ShapeDrawable填充

时间:2019-12-04 14:08:36

标签: android android-view padding android-background android-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>不是视图组,因此它不允许使用attrs(例如background等)

<?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

当然,这可以很好地渲染,并带有较大的填充:

Custom view with padding set on the shape

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

Custom view with 0dp padding set programmatically

最后,为什么setPadding()会更改<shape>的可绘制填充而不是视图的填充

0 个答案:

没有答案