我有一个带有背景可绘制的自定义视图。
可绘制对象具有带填充的内部形状。视图本身没有应用填充。
每当我使用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,因为我在视图上没有指定!),这就是发生的事情:
总之,为什么 setPadding() 改变了<shape>
可绘制的填充而不是视图的填充?