我有一个带有背景可绘制背景的自定义视图。
可绘制对象的内部形状带有填充。 视图本身未应用填充。
每当我使用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
当然,这可以很好地渲染,并带有较大的填充:
....但是如果我只是以编程方式或通过xml 将视图自身的填充设置为0dp(并且应该已经在0dp上,因为我在视图上未指定!),这就是发生的情况:
最后,为什么setPadding()会更改<shape>
的可绘制填充而不是视图的填充?