我的layer-list drawable无法设置圆角

3

我制作了一个按钮可绘制对象,它由渐变形状和实心形状组成,都在一个类似于图层列表的对象中:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:height="25dp">
        <shape android:shape="rectangle" >
            <gradient
                android:angle="90"
                android:startColor="@color/greyDark1"
                android:endColor="@color/greyDark2"/>
        </shape>
    </item>
    <item android:top="25dp" android:height="25dp">
        <shape android:shape="rectangle" >
            <solid android:color="@color/black" />
        </shape>
    </item>
</layer-list>

但我无法正确处理角落。 我需要整个形状周围有圆角,但内部不需要(所以顶部的topRight和topLeft半部分,底部的bottomRight和bottomLeft半部分需要)。

如果我使用<corners android:radius="8dp">来设置两个半部分,那么顶部半部分的底部角和底部半部分的顶部角也会被圆角化,这不是我想要的。

如果我为顶部半部分设置<corners android:topRightRadius="8dp" android:topLeftRadius"8dp">,并为底部半部分设置<corners android:bottomRightRadius="8dp" android:bottomLeftRadius"8dp">,则顶部半部分将成为可绘制的完整大小,使渐变不起作用,底部角也是相同的颜色。

这里是我试图实现的图像:

ButtonDrawable

有人知道解决方法吗?

编辑:

我已经得到了一些答案,感谢那些回答我的人,但遗憾的是它们似乎都不起作用。

我从 bofredo 和 Bhuvnesh Chasta 得到的答案导致出现了这样的问题:

ButtonDrawable wrong (looks a bit like a burger)

我从curiousMind得到的答案看起来很不错,但不是我想要的:

ButtonDrawable wrong (although it looks pretty nice)

最终编辑:

我已经与我的合作伙伴讨论了这个问题,我们都认为让它看起来像这样并不是那么重要,所以我们选择了纯色。

我仍然要感谢所有帮助过我的人,所有现有的答案都会得到赞和采纳,我将接受 waqaslam 的答案,因为他非常接近我想要的。


你能按照你想要的方式展示图片吗? - curiousMind
@Dennis 请尝试这个:https://dev59.com/W2Up5IYBdhLWcg3wtZPt - curiousMind
@curiousMind 我在编辑中添加了一张图片,我真的希望能够只使用Android XML设置这些角落。 - Dennis van Opstal
看我的回答,兄弟。 - Bajirao Shinde
5个回答

2

我认为使用xml是最接近你所期望的drawable的方法。

enter image description here

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape android:shape="rectangle">
        <corners android:radius="2dp"/>
        <gradient android:startColor="#4e4e4e" android:centerColor="#626262" android:endColor="@android:color/transparent" android:angle="270" />
    </shape>
</item>
<item>
    <shape android:shape="rectangle">
        <corners android:radius="2dp"/>
        <gradient android:startColor="@android:color/transparent" android:centerColor="#4c4c4c" android:endColor="#1c1c1c" android:angle="270" />
    </shape>
</item>

也许你应该使用9-patch drawable来获得精确的效果。

1

试试这个。你应该在形状中使用两个角来实现圆角。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item >
    <shape
        android:shape="rectangle">
        <solid android:color="#b2d1d1ef" />
        <corners android:radius="1dp"/>
    </shape>
</item>
<item android:right="1dp" android:left="1dp" android:bottom="2dp" android:top="1dp">
    <shape
        android:shape="rectangle">
        <solid android:color="#FFFFFF"/>
        <corners android:radius="5dp"/>
    </shape>
</item>


1
这似乎并没有真正起作用(它有点像汉堡包),结果在我的最后一次编辑中。 - Dennis van Opstal

1
我之前也遇到过这个问题。你可以在这里找到相关问题。
以下是可行的答案:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
   <item>
     <shape xmlns:android="http://schemas.android.com/apk/res/android" >   
     <solid android:color="@color/cocus_orange"/>
     <corners android:radius="15px"/>
     <padding android:left="1dp" android:top="1dp" android:right="1dp" android:bottom="1dp" /> 
</shape>
</item>
<item>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient android:angle="90" 
        android:startColor="#880f0f10" 
        android:centerColor="#880d0d0f" 
        android:endColor="#885d5d5e"/>
        <corners
            android:radius="15px" />
 </shape> 
</item>
</layer-list>

这似乎并不真正起作用(它有点像汉堡包),结果在我的最后一次编辑中。 - Dennis van Opstal
这很棘手。也许有定制的解决方案。 - bofredo

1
尝试这样做。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">

<gradient
    android:angle="270"
    android:endColor="#000"
    android:startColor="#787575" />

<corners android:radius="8dip" />

这似乎并不真正起作用(尽管看起来很漂亮),结果在我的最后一次编辑中。 - Dennis van Opstal
@DennisvanOpstal 如果你想从图层列表中进行操作,根据我的了解是不可能的,因为两个列表是不同的,你不能将它们包装在一个列表中并给出半径... - curiousMind
哪个实体?我改变了我的半径.. 再检查一遍。 - curiousMind
半径是正确的,我看到了,但我的意思是你的形状包含一个实心和一个渐变,但只显示了渐变。 - Dennis van Opstal
没有使用 solid,它看起来仍然一样... @DennisvanOpstal - curiousMind
显示剩余3条评论

0
今天发现了这个问题并解决了,我在这里分享一下,以防其他人也会像原帖作者一样找不到答案,并想知道正确的方法,我相信原帖作者已经不需要了。 我为每个项目的绘制设置了起点/终点,顶部的渐变从按钮开始,结束后20dp,底部从20dp后开始,直到按钮结束。您甚至可以从附件中看到它与原帖作者想要的结果相同! :) (我没有10个声望来发布图片。) {{link1:来自Android Studio的按钮预览}}
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:bottom="20dp">
        <shape
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <gradient
                android:angle="270"
                android:startColor="#4e4e4e"
                android:endColor="#626262"
                android:type="linear"/>
        </shape>
    </item>
    <item android:top="20dp">
        <shape
            android:shape="rectangle" >
            <gradient
                android:angle="270"
                android:startColor="#4c4c4c"
                android:endColor="#1c1c1c"
                android:type="linear"/>
            <corners android:bottomLeftRadius="8dp" android:bottomRightRadius="8dp"/>
        </shape>
    </item>
</layer-list>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接