【问题标题】:How to set union shape with dynamic size and spect ratio in android drawable如何在android drawable中设置具有动态大小和纵横比的联合形状
【发布时间】:2020-03-09 05:37:37
【问题描述】:

我想制作如下图所示的形状。图中尺寸如下

  • 圆形/椭圆大小为 30px
  • 圆角矩形高20px,宽65px
  • 矩形起点设置为圆心,因此图形总大小为 80 像素。

但是,对于 drawable,我需要响应大小,以便我可以将它用于任何 视图的大小。

我可以通过重叠来创建一个形状,从而产生类似的错觉。我不确定在 android 中是否可以使用布尔类型(图形)。

可绘制的 XML

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

    <item>
        <shape android:shape="rectangle">
            <size
                android:width="75dp"
                android:height="30dp" />
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>

    <item android:right="60dp">
        <shape android:shape="oval">
            <solid android:color="@color/colorPrimary" />
            <size
                android:width="30dp"
                android:height="30dp" />
        </shape>
    </item>

    <item android:left="15dp" android:top="10dp" android:bottom="10dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorPrimary" />
            <size
                android:width="66dp"
                android:height="20dp" />
            <corners
                android:bottomRightRadius="20dp"
                android:topRightRadius="20dp" />
        </shape>
    </item>

</layer-list>

上面的 XML 生成形状如下图所示

当我将形状设置为View 时,它的输出如下图所示

布局 XML

<View
    android:layout_width="80dp"
    android:layout_height="30dp"
    android:background="@drawable/shape_flask"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

输出

如您所见,即使在可绘制和视图形状中定义大小也不会遵守大小纵横比。我敢肯定是我做错了什么。

问题:如何使可绘制形状适用于任何尺寸的视图,同时保持纵横比与 图形中的相同 参考。以及如何为其添加投影。

已编辑

我已经解决了一些尺寸问题,但形状仍然有问题。为了更好地可视化,我为两种形状设置了不同的颜色。

可绘制的 XML

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

    <item>
        <shape android:shape="rectangle">
            <size
                android:width="80dp"
                android:height="30dp" />
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>

    <item android:right="60dp">
        <shape android:shape="oval">
            <solid android:color="@color/colorPrimary" />
            <size
                android:width="30dp"
                android:height="30dp" />
        </shape>
    </item>

    <item android:left="15dp" android:top="5dp" android:bottom="5dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorAccent" />
            <size
                android:width="66dp"
                android:height="20dp" />
            <corners
                android:bottomRightRadius="20dp"
                android:topRightRadius="20dp" />
        </shape>
    </item>

</layer-list>

但正如您在下面的视图屏幕截图中看到的那样,它不会输出相同的大小和位置。但是,View 代码是一样的。

【问题讨论】:

  • 是不是太难了?

标签: android drawable android-drawable xml-drawable


【解决方案1】:

这样分割drawable怎么样?

布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <View
        android:id="@+id/oval"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:background="@drawable/shape_oval" />

    <TextView
        android:id="@+id/rec"
        android:layout_width="65dp"
        android:layout_height="20dp"
        android:layout_centerVertical="true"
        android:layout_toEndOf="@+id/oval"
        android:layout_toRightOf="@+id/oval"
        android:background="@drawable/shape_rec"
        android:layout_marginStart="-15dp"
        android:layout_marginLeft="-15dp" />
</RelativeLayout>

shape_oval

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="@color/colorPrimary" />
</shape>

shape_rec

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@color/colorAccent" />
    <size
        android:width="66dp"
        android:height="20dp" />
    <corners
        android:bottomRightRadius="20dp"
        android:topRightRadius="20dp" />
</shape>

预览

【讨论】:

  • 感谢您的帮助。我很感激。我只能在没有阴影的情况下使用它,但正如您在图形中看到的那样,我还必须为元素添加阴影。如果我将制作两个不同的形状而不是阴影将是一个问题。此外,我可以将其导出为 SVG,并可以将其设置为任何视图的背景,但要寻找可绘制选项。
  • 好吧,我仍在等待一个强大的解决方案来创建一个单独的可绘制对象。在那之前,我会认为你的回答是有效的。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-09-05
  • 2021-05-10
  • 2018-08-02
  • 2013-06-12
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 2018-10-18
相关资源
最近更新 更多