如何使用Android xml形状在圆圈内绘制圆圈?

jas*_*457 40 java android android-drawable android-shape

我正试图为我的应用程序制作一个搜索栏的拇指,我想要一个由不同的,更大的(半透明)外圈包围的内圈.我正在尝试使用layer-list,但我遇到了问题.以下是我的代码......

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
    <shape
        android:shape="oval" >
        <solid android:color="#00f" />

        <size
            android:height="15dp"
            android:width="15dp" />
    </shape>
</item>

<item>
    <shape
        android:shape="oval" >
        <solid android:color="#f00" />

        <size
            android:height="10dp"
            android:width="10dp" />
    </shape>
</item>

</layer-list>
Run Code Online (Sandbox Code Playgroud)

我希望在一个更大的蓝色圆圈上面看到一个小红圈,但我所看到的只是一个小红圈.有没有人有任何想法?

Sea*_*eau 77

我实现这一点的唯一方法是为内部(即顶部)圆定义一个透明笔划,它是较大和较小圆的大小之间的差异.

例如,这个:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Larger blue circle in back -->
<item>
    <shape android:shape="oval">
        <solid android:color="#00f"/>
        <size
                android:width="15dp"
                android:height="15dp"/>
    </shape>
</item>
<!-- Smaller red circle in front -->
<item>
    <shape android:shape="oval">
        <!-- transparent stroke = larger_circle_size - smaller_circle_size -->
        <stroke android:color="@android:color/transparent"
                android:width="5dp"/>
        <solid android:color="#f00"/>
        <size
                android:width="10dp"
                android:height="10dp"/>
    </shape>
</item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)

......看起来像这样:

在此输入图像描述

  • 内圈没有出现在中心......是否需要对代码进行任何修改......? (2认同)
  • 请注意,此解决方案会创建**过度绘制**,因为它在另一个实心圆的顶部绘制一个实心圆。您可以在开发者设置中检查是否存在过度绘制(调试 GPU 过度绘制 -&gt; 显示过度绘制区域)。您可以通过将一些“&lt;padding&gt;”设置为较大的圆圈来消除此问题,该圆圈不应为“&lt;solid&gt;”,而应只有“&lt;lines&gt;”。或者更好:如果您只需要 2 个圆圈,则只需使用一个带有内部“&lt;solid&gt;”和外部“&lt;lines&gt;”的圆圈。 (2认同)

Alb*_*lvo 11

如果您需要绘制3 个或更多圆圈,请遵循以下模式:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Larger blue circle -->
    <item>
        <shape android:shape="oval">
            <padding
                android:bottom="20dp"
                android:left="20dp"
                android:right="20dp"
                android:top="20dp" />
            <size
                android:width="100dp"
                android:height="100dp" />
            <stroke
                android:width="20dp"
                android:color="#0000ff" />
        </shape>
    </item>
    <!-- Green circle in middle -->
    <item>
        <shape android:shape="oval">
            <padding
                android:bottom="20dp"
                android:left="20dp"
                android:right="20dp"
                android:top="20dp" />
            <size
                android:width="100dp"
                android:height="100dp" />
            <stroke
                android:width="20dp"
                android:color="#00ff00" />
        </shape>
    </item>
    <!-- Smaller red circle at front -->
    <item>
        <shape android:shape="oval">
            <size
                android:width="100dp"
                android:height="100dp" />
            <solid android:color="#ff0000" />
        </shape>
    </item>
</layer-list>

Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

请注意,与此处的其他答案不同,此解决方案不会在其他圆的顶部绘制圆,从而避免 overdraw


小智 10

希望它会有所帮助.这是可绘制的*.xml

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

      <item>
          <shape android:shape="oval">
              <padding
                  android:bottom="1dp"
                  android:left="1dip"
                  android:right="1dp"
                  android:top="1dp" />

              <solid android:color="#000" />
          </shape>
      </item>
      <item>
          <shape android:shape="oval">
              <padding
                  android:bottom="1dp"
                  android:left="1dip"
                  android:right="1dp"
                  android:top="1dp" />

              <solid android:color="#EEE" />
          </shape>
      </item>
    </layer-list>
Run Code Online (Sandbox Code Playgroud)


Ami*_*mir 9

它很晚但可能有用,你可以使用填充中心圆.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape
        android:shape="oval">
        <solid
            android:color="#00fff"/>
        <padding
            android:bottom="30dp"
            android:left="30dp"
            android:right="30dp"
            android:top="30dp"/>
        <stroke
            android:width="1dp"
            android:color="@color/holo_red_light"/>
    </shape>
</item>
<item>
    <shape
        android:shape="oval">
        <solid
            android:color="#00666666"/>

        <size
            android:width="120dp"
            android:height="120dp"/>
        <stroke
            android:width="1dp"
            android:color="@color/holo_red_light"/>
    </shape>

</item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)


sco*_*yab 7

我设法通过设定的宽度和高度,以解决这个问题<item><layer-list>.可能不是最佳实践,但在列表视图中具有固定尺寸的图标背景似乎没问题.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- larger circle at the back -->
    <item android:height="54dp" android:width="54dp" android:gravity="center">
        <shape
               android:shape="oval">

            <solid
                android:color="#0000FF"/>

            <!-- thicker outer boarder -->
            <stroke
                android:width="2dp"
                android:color="#000000"/>
        </shape>
    </item>


    <!-- inner circle -->
    <item android:height="40dp" android:width="40dp" android:gravity="center">
        <shape
               android:shape="oval"  >
            <solid
                android:color="#00FF00"/>

            <stroke
                android:width="1dp"
                android:color="#000000"/>

        </shape>
    </item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)

  • `android:height`和`android:width`要求API 23+用于形状.使用`<size>`标签代替旧设备. (3认同)

war*_*ero 5

我在这里结束了对同心圆的搜索,发现仅使用层列表方法找到了答案,因此仅使用来添加我的答案shape,希望对您有所帮助。

<shape android:shape="oval">
    <solid android:color="#FFF" />
    <size
        android:width="15dp"
        android:height="15dp" />
    <stroke
        android:width="6dp"
        android:color="#000" /> 
</shape>
Run Code Online (Sandbox Code Playgroud)

这就是结果。 在此处输入图片说明