半圆形状无法正常工作。

43

我试图创建一个半圆形的背景,在开发 IDE 预览中它可以工作,但是当我在模拟器中启动时它无法工作。

在这里输入图片描述

这是我的形状代码:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:height="50dp">
        <shape>
            <solid android:color="@color/colorAccentDark" />
        </shape>
    </item>
    <item android:top="-500dp" android:bottom="0dp" android:left="-100dp" android:right="-100dp">
        <shape>
            <corners android:radius="500dp" />
            <solid android:color="@color/colorAccentDark" />
        </shape>
    </item>
</layer-list>

这是我的布局代码:

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

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/background_profile"
        android:layout_weight="1">

        <de.hdodenhof.circleimageview.CircleImageView
            android:id="@+id/profile_avatar"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:src="@drawable/ic_default_avatar"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="50dp"/>

        <TextView
            android:id="@+id/profile_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_below="@id/profile_avatar"
            android:layout_marginTop="20dp"
            android:textColor="@color/neutralWhite"
            android:textStyle="bold"
            android:textSize="18sp"
            android:text="Avatar Ang"/>

    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="4.04">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello Android!"/>

    </RelativeLayout>

</LinearLayout>

也许有其他处理方法吗? 谢谢


你需要明确你的问题。它不是你所期望的样子吗(如果不是,请解释一下哪里出了问题)?你的应用程序崩溃了吗(如果是这样,请展示logcat以进行诊断)?请阅读stackoverflow上关于“如何提出一个好问题”的帮助: Asking A Good Question - Sound Conception
不,我的应用程序没有崩溃。它默默地不工作。 - dooplaye
6个回答

77

你可以尝试这个:

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#900021df"/>
    <size
        android:width="10dp"
        android:height="5dp"/>
    <corners
        android:bottomLeftRadius="20dp"
        android:bottomRightRadius="20dp"/>
</shape>

它给出了这个形状:


73

curve_toolbar_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle"/>
    </item>
    <item
        android:bottom="0dp"
        android:left="-100dp"
        android:right="-100dp"
        android:top="-80dp">
        <shape android:shape="oval">
            <solid android:color="@color/colorPrimary" />
        </shape>
    </item>
</layer-list>

主活动界面.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="?android:attr/actionBarSize"
        android:background="@drawable/rounded_corner"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0">

    </android.support.v7.widget.Toolbar>
</android.support.constraint.ConstraintLayout>

曲线形状工具栏


谢谢。这也适用于其他视图,如底部导航、文本视图等。 - Bhaskara

23

试试这个。移除渐变部分,它看起来就像你想要的那样。

<item>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <solid android:color="#00B0EA" />

    </shape>
</item>
<item
    android:bottom="400dp"
    android:left="-100dp"
    android:right="-100dp"
    android:top="-200dp">
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="oval">
        <gradient
            android:angle="90"
            android:endColor="#65FFFFFF"
            android:startColor="#65FFFFFF" />
    </shape>
</item>
<item
    android:bottom="402dp"
    android:left="-100dp"

    android:right="-100dp"
    android:top="-280dp">
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="oval">
        <solid android:color="#FFFFFF" />
    </shape>
</item>

输入图像描述


20

Background.xml


<?xml version="1.0" encoding="utf-8"?>
<layer-list  xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="#FFFFFF" />
        </shape>
    </item>
    <item
        android:bottom="410dp"
        android:left="-100dp"
        android:right="-100dp"
        android:top="-300dp">
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="oval">

            <solid android:color="#7181A1" />
        </shape>
    </item>
</layer-list>

输出结果类似于

这里输入图片描述


4

你无法通过xml创建一个半圆,但是你可以使用适当的边距和填充来实现你想要的效果。

像这样创建一个固定大小的圆:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval"
    android:useLevel="false" >
    <solid android:color="#006AC5" />
    <size
        android:height="50dp"
        android:width="50dp" />
</shape>

现在,您可以像这样将其用作TextView的背景:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFF00">

    <ImageView
        android:contentDescription="@string/app_name"
        android:id="@+id/img"
        android:layout_width="fill_parent"
        android:layout_height="200dip"
        android:layout_alignParentTop="true"
        android:background="#006AC5" />

    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/img"
        android:layout_marginTop="-35dip"
        android:paddingTop="10dip"
        android:background="@drawable/circle"
        android:layout_centerHorizontal="true"
        android:text="@string/one"
        android:gravity="center"/>

</RelativeLayout>

现在,如果你给你的TextView一个-25dip的顶部边距(半个圆形的高度),你就可以在底部得到一个完美的半圆形,但是我只是添加了另外的10dip(和10dip的填充来保持文本位置不变)只是为了更仔细地看到你正在寻找的东西。
如果你想要进一步改变顶部ImageView的背景色,并且你不希望其余的圆形影响外观,你可以在添加TextView后添加ImageView,这样它就有了更高的z-index,然后使用一个单独的TextView在图像上方显示文本。我知道这很恶心,但它应该可以工作 :)

如果imageView的背景是随机图片怎么办? - dooplaye
你只需要在添加TextView后将其添加到xml中(这样它就会放置在文本上方),然后为TextView添加一些额外的顶部填充,以便您可以看到文本。这是它可能看起来的样子:<TextView ... android:layout_below="@+id/img" android:paddingTop="20dip"/> <ImageView ... android:id="@id/img" /> - mmbrian

1
你可以尝试使用 ShapeOfView
<io.github.florent37.shapeofview.shapes.ArcView
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:elevation="4dp"
    app:shape_arc_height="20dp"
    app:shape_arc_position="bottom">

    <!-- YOUR CONTENT -->

</io.github.florent37.shapeofview.shapes.ArcView>

图像结果


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