如何在图层列表中设置可绘制尺寸

发布于 2024-11-30 05:28:48 字数 801 浏览 1 评论 0原文

我在设置图层列表中可绘制对象的大小时遇到​​问题。我的 XML 如下所示:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/menu_drawable1"/>
    <item android:drawable="@drawable/menu_drawable2"/>       
</layer-list>

Drawable1 比 Drawable2 大,因此 Drawable2 会调整大小。如何覆盖它并设置 Drawable2 的原始大小?我不想让它调整大小。我尝试设置宽度和高度,但这不起作用。另外,可绘制对象实际上并不是位图,它们是选择器,所以我不能使用位图技巧。


看起来我已经通过使用“左”和“右”得到了一半的解决方案,但是,这仍然不允许我自动设置图像的确切大小。现在我的 xml 看起来像这样:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/menu_drawable1"/>
    <item android:drawable="@drawable/menu_drawable2" android:right="150dp"/>       
</layer-list>

I'm having problem with setting size of drawable in layer-list. My XML looks like this:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/menu_drawable1"/>
    <item android:drawable="@drawable/menu_drawable2"/>       
</layer-list>

Drawable1 is bigger than Drawable2, so Drawable2 gets resized. How to override this and set the original size of Drawable2? I don't want it to resize. I tried with setting width and height but that doesn't work. Also the drawables aren't actually bitmaps, they are selectos, so I can't use the bitmap trick.


It looks like I've got half of the solution by using "left" and "right", but still, this doesn't let me set the exact size of the image automatically. Now my xml looks like this:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/menu_drawable1"/>
    <item android:drawable="@drawable/menu_drawable2" android:right="150dp"/>       
</layer-list>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

猛虎独行 2024-12-07 05:28:48

您可以使用具有所需值的 android:widthandroid:height 参数。

下面是示例可绘制图层列表和屏幕截图。我使用了来自 google 材质图标的矢量可绘制元素和自己的选择器可绘制元素。

原始的circle.xml可绘制形状具有100dp x 100dp大小,但在drawable.xml中,我通过android:widthandroid:height参数将此值覆盖为24dp x 24dp。

我希望这有帮助!

drawable.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/circle" android:height="24dp" android:width="24dp"/>
    <item android:drawable="@drawable/ic_accessibility_black_24dp"/>
    <item android:drawable="@drawable/ic_http_white_24dp" android:gravity="center" android:top="-3dp" android:height="5dp" android:width="5dp"/>
</layer-list>

Circle.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:innerRadius="20dp" android:shape="oval">
            <solid android:color="#CCC" />
            <size android:width="100dp" android:height="100dp"/>
        </shape>
    </item>
</selector>

屏幕截图

You can use android:width and android:height parameters with desired values.

Below is the sample drawable layer-list and screen shot. I used the vector drawable from google material icons and own selector drawable.

Original circle.xml drawable shape have 100dp x 100dp size, but into drawable.xml I override this values to 24dp x 24dp by android:width and android:height parameters.

I hope this help!

drawable.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/circle" android:height="24dp" android:width="24dp"/>
    <item android:drawable="@drawable/ic_accessibility_black_24dp"/>
    <item android:drawable="@drawable/ic_http_white_24dp" android:gravity="center" android:top="-3dp" android:height="5dp" android:width="5dp"/>
</layer-list>

circle.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:innerRadius="20dp" android:shape="oval">
            <solid android:color="#CCC" />
            <size android:width="100dp" android:height="100dp"/>
        </shape>
    </item>
</selector>

screen shot

茶花眉 2024-12-07 05:28:48

您可以为此使用插入标签。
例如,

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:drawable="@drawable/menu_drawable1"/>
   <item>
       <inset android:drawable="@drawable/menu_drawable2"
           android:insetRight="50dp"
           android:insetTop="50dp"
           android:insetLeft="50dp"
           android:insetBottom="50dp" />
   </item>

这将在您的 menu_drawable2 周围创建填充,因此它不会被缩放。只需设置您需要的尺寸即可。

You can use inset tag for this.
For example

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:drawable="@drawable/menu_drawable1"/>
   <item>
       <inset android:drawable="@drawable/menu_drawable2"
           android:insetRight="50dp"
           android:insetTop="50dp"
           android:insetLeft="50dp"
           android:insetBottom="50dp" />
   </item>

This will create paddings around you menu_drawable2 so it won`t be scaled. Just set the dimensions that you require.

傲娇萝莉攻 2024-12-07 05:28:48

我也在 Android 5.0 (API 21) 上遇到了这个问题。看来item重力不适用于API 小于 23。因此需要更新布局,我通过为第二个项目节点应用计算的填充来使其兼容,该节点应该是右上对齐的覆盖层。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_svg_filter_black"/>

    <item
        android:left="16dp"
        android:right="0dp"
        android:top="0dp"
        android:bottom="16dp"
        android:drawable="@drawable/ic_circle_dot_red"
    />
</layer-list>

I also came across the issue on Android 5.0 (API 21). It seems the gravity of item doesn't work for API less than 23. So the layout is required to be updated, I've made it compatible by applying calculated paddings for the second item node which is supposed to be a right-top aligned overlay.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_svg_filter_black"/>

    <item
        android:left="16dp"
        android:right="0dp"
        android:top="0dp"
        android:bottom="16dp"
        android:drawable="@drawable/ic_circle_dot_red"
    />
</layer-list>
烟─花易冷 2024-12-07 05:28:48

对于低于 23 的 API 级别,您可以在 对象上指定 ,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item>
        <shape android:shape="oval" android:tint="@color/darkDeepBlue">
            <padding android:right="2dp" android:top="2dp" android:bottom="2dp" android:left="2dp"/>
        </shape>
    </item>

    <item>
        <shape android:shape="oval" android:tint="@color/sunnyYellow">
            <size android:width="8dp" android:height="8dp"/>
        </shape>
    </item>

</layer-list>

在此处输入图像描述

For API levels below 23, you can specify <size> on <shape> objects like below:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item>
        <shape android:shape="oval" android:tint="@color/darkDeepBlue">
            <padding android:right="2dp" android:top="2dp" android:bottom="2dp" android:left="2dp"/>
        </shape>
    </item>

    <item>
        <shape android:shape="oval" android:tint="@color/sunnyYellow">
            <size android:width="8dp" android:height="8dp"/>
        </shape>
    </item>

</layer-list>

enter image description here

笑忘罢 2024-12-07 05:28:48

希望这会有所帮助:-
您可以为 menu_drawable2 使用九个补丁可绘制对象。您可以使 menu_drawable2 就像在其边缘周围具有透明区域一样。使用此透明区域指定九个面片中的可拉伸区域。

Hope this will help :-
You can use a nine patch drawable for menu_drawable2. You can make menu_drawable2 like having transparent region around it edges. Use this transparent region to specify stretchable region in nine patch.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文