【问题标题】:Can't get rounded corners for my layer-list drawable无法为我的图层列表绘制圆角
【发布时间】:2023-12-01 21:47:02
【问题描述】:

我制作了一个可绘制的按钮,它由渐变形状和实心形状组成,两者都在这样的图层列表中:

<?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 用于下半部分)。

如果我将两半都设置为&lt;corners android:radius="8dp"&gt;,则上半部分的底角和下半部分的顶角也是圆角的,这不是我想要的。

如果我将&lt;corners android:topRightRadius="8dp" android:topLeftRadius"8dp"&gt; 设置为上半部分,&lt;corners android:bottomRightRadius="8dp" android:bottomLeftRadius"8dp"&gt; 设置为下半部分,则上半部分将是可绘制对象的完整大小,导致渐变无法正常工作,并且底角也是相同的颜色。

这是我想要完成的图像:

有人知道解决办法吗?

编辑:

我得到了一些答案,对此我很感激,但遗憾的是它们似乎不起作用。

我从 bofredo 和 Bhuvnesh Chasta 得到的答案是这样的:

而且我从奇怪的头脑得到的答案看起来很不错,但不是我的目标:

最终编辑:

我已经和我一起工作的人讨论过这个问题,我们都同意让它看起来不是那么重要,所以我们选择了纯色。

我仍然要感谢所有提供帮助的人,所有当前的答案都会得到支持,我会接受 waqaslam 的答案,因为他非常接近我想要的。

【问题讨论】:

  • 图片可以随意展示吗?
  • *.com/q/15100660/5093666 @Dennis 试试这个
  • @curiousMind 我在编辑中添加了一张图片,我真的很想用 android xml 设置这些角落
  • 看我的答案兄弟......

标签: android xml drawable rounded-corners layer-list


【解决方案1】:

我认为这是使用 xml 可以达到的最接近所需可绘制对象的方法。

<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 来获得确切的效果。

【讨论】:

    【解决方案2】:

    很久以前我也遇到过这个问题。你可以找到那个问题HERE

    这是来自工作答案:

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

    【讨论】:

    • 这似乎不起作用(它有点像汉堡),结果在我的最后一次编辑中
    • 这很棘手。也许有定制的解决方案。
    【解决方案3】:

    这样试试

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

    【讨论】:

    • 这似乎并没有真正起作用(虽然它看起来很漂亮),结果在我的最后一次编辑中
    • @DennisvanOpstal 如果你想从 layerlist 做,那么据我所知这是不可能的,因为两者都是不同的列表,你不能把它包装成一个并给出半径......
    • 这可能是真的,但我也看不出如果没有图层列表它会如何工作,因为如果我使用你的代码,甚至不会显示实体部分
    • 哪个实心的??我改变了我的半径..再次检查
    • 半径是正确的,我看到了,但我的意思是你的形状包含一个实体和一个渐变,但只显示渐变
    【解决方案4】:

    试试这个。您应该在形状中使用 to corners 来实现圆角。

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

    【讨论】:

    • 这似乎不起作用(它有点像汉堡),结果在我的最后一次编辑中
    【解决方案5】:

    今天发现了这个问题并解决了,我正在分享它,以防其他人发现它没有按照 OP 的要求解决,并且想知道正确的方法,因为我确信 OP 不再需要它。 我为每个项目的绘制制作了起点/终点,顶部的渐变从按钮开始的地方开始,在 20dp 之后结束,底部在 20dp 之后开始并在按钮的末尾结束。您甚至可以从附件中看到它与 OP 想要的结果相同! :) (我没有 10 声望来发布图片。) Button Preview from 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>
    

    【讨论】: