放大Android渐变绘制的中心

Tot*_*Zam 5 xml android gradient android-drawable

我创建了一个Android渐变可绘制对象,其中顶部和底部为黑色,中心为透明:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <gradient
        android:startColor="@android:color/black"
        android:centerColor="@android:color/transparent"
        android:endColor="@android:color/black"
        android:angle="90"/>
</shape>
Run Code Online (Sandbox Code Playgroud)

渲染的渐变如下所示:

渐变图片

如您所见,黑色部分扩散到了屏幕的大部分区域。我希望黑色仅在顶部和底部的一小部分显示。有什么办法可以使透明中心变大,或者使顶部和底部的黑色条纹变小?

我尝试使用链接GradientDrawable文档中提到的其他一些XML属性,但是似乎它们都不起作用。

Tot*_*Zam 6

对于纯 XML 解决方案,您可以layer-list使用两个单独的gradient对象创建一个。

以下代码创建两个重叠的gradient对象并使用centerYwithcenterColor来偏移黑色部分。在这里,centerY属性设置为0.90.1,因此黑色被限制在视图高度的顶部和底部 10%。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <gradient
                android:angle="90"
                android:centerColor="@android:color/transparent"
                android:centerY="0.9"
                android:endColor="@android:color/black"
                android:startColor="@android:color/transparent" />
        </shape>
    </item>

    <item>
        <shape>
            <gradient
                android:angle="90"
                android:centerColor="@android:color/transparent"
                android:centerY="0.1"
                android:endColor="@android:color/transparent"
                android:startColor="@android:color/black" />
        </shape>
    </item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)

对于 API 级别 23 或更高级别,以下解决方案也适用,使用android:height. 即使您不知道视图的总高度,只要您知道希望渐变有多大,这个解决方案就可以工作。

此代码创建了两个单独的渐变,每个渐变的高度为60sp,然后用于android:gravity将渐变浮动到视图的顶部和底部。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:height="60sp"
        android:gravity="top">
        <shape android:shape="rectangle">
            <gradient
                android:angle="90"
                android:endColor="@android:color/black"
                android:startColor="@android:color/transparent" />
        </shape>
    </item>
    <item
        android:height="65sp"
        android:gravity="bottom">
        <shape android:shape="rectangle">
            <gradient
                android:angle="90"
                android:endColor="@android:color/transparent"
                android:startColor="@android:color/black" />
        </shape>
    </item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)

感谢您@Luksprog的代码帮助,@thenaoh为理念的开始。

上述解决方案有效,而且它们是纯 XML 很好。如果您的渐变显示为条纹,您可能需要尝试编程解决方案,如@lelloman 的答案中所示,以创建更平滑的渐变。