Android-上部のみが丸い角のドローアブル


151

私はこのドローアブルを背景として丸い長方形にするために持っていました:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/white" />
    <stroke android:width="1dp" android:color="@color/light_gray" />
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
    <corners android:radius="6dp" />
</shape>

予想通り、これは正常に機能しています。

これを上端のみを丸めるように変更したいので、次のように変更します。

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/white" />
    <stroke android:width="1dp" android:color="@color/light_gray" />
    <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
    <corners android:topLeftRadius="6dp" android:topRightRadius="6dp"
             android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>
</shape>

しかし、今度は角が丸くならず、単純な長方形になります。ここで何が欠けていますか?


これは実際には解決策ではありませんが、私はかつて同様の問題を抱えていたと思います。ストロークを2ピクセルに増やすと効果的ですが、これは解決策ではありません。
Code Poet

形状の角に関する問題は次のとおり
id=

回答:


303

次の値を指定してみてください:

 <corners android:topLeftRadius="6dp" android:topRightRadius="6dp"
         android:bottomLeftRadius="0.1dp" android:bottomRightRadius="0.1dp"/>

に変更0dpしたことに注意してください0.1dp

編集:よりクリーンなバージョンについては、以下のAleks G コメントを参照してください


131
これをさらに調査したところ、さらに優れた解決策が見つかりました。-これにより、<corners android:radius="1dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp"/>丸みを帯びたヒントもなく、完全に四角い下隅が生成されます。ただし、ソリューションはほとんど機能します。
Aleks G 2012

ビットマップを与えられたコードでそれを行う方法?そして、その周りに輪郭(別名ストローク)を追加するにはどうすればよいですか?
Android開発者

@Aleks G指定する必要があるとは思わないandroid:radius="1dp"
hmac '13

@hmac必要です。ドキュメンテーションを読んで、それはそれを明確にします。
Aleks G

@AleksGええ、ドキュメントは間違っています。Samsung10、Android 9でテストします。「すべてのコーナーには、(最初​​に)1より大きいコーナー半径を指定する必要があります。そうでない場合、コーナーは丸められません。特定のコーナーが丸められないようにするには、回避策は、android:radiusを使用してデフォルトのコーナー半径を1より大きい値に設定してからオーバーライドすることです。 "-trueではなく、右下、右上、左上をゼロとして指定し、左下+ veおよび左下が正しく湾曲している
hmac

14

このようなことをしてみてください:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:bottom="-20dp" android:left="-20dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="20dp" />
        </shape>
    </item>
</layer-list>

長方形の異なるコーナー半径を設定するのは適切ではないようです。したがって、このハックを使用できます。


私自身の回答を参照してください-コーナーごとに異なる半径を持つことは完全に許容されます。
Aleks G 2015

私はこのアプローチを試してみましたが、受け入れられません。異なるrsdiusを持つことは適切ではなく、無視されます
busylee

11

私の場合、コードの下

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

        <shape android:shape="rectangle">
            <solid android:color="@color/maincolor" />

            <corners
                android:topLeftRadius="10dp"
                android:topRightRadius="10dp"
                android:bottomLeftRadius="0dp"
                android:bottomRightRadius="0dp"
            />
        </shape>

    </item>
    </layer-list>

1
ビューのパディングが必要でない限り、アイテムの上部と下部のプロパティは必要ありませんが、それ以外の場合は機能します。
RominaV 2016年

9

busyleeの答えに基づいて、これは丸みのないdrawableが1つしかない(この例では左上)のを作成する方法です。

<?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="@color/white" />
            <!-- A numeric value is specified in "radius" for demonstrative purposes only,
                  it should be @dimen/val_name -->
            <corners android:radius="10dp" />
        </shape>
    </item>
    <!-- To keep the TOP-LEFT corner UNROUNDED set both OPPOSITE offsets (bottom+right): -->
    <item
        android:bottom="10dp"
        android:right="10dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
        </shape>
    </item>
</layer-list>

上記drawableはAndroid Studioプレビュー(2.0.0p7)では正しく表示されないことに注意してください。とにかくそれをプレビューするには、別のビューを作成し、これをとして使用しandroid:background="@drawable/..."ます。


6
@AleksG-もちろんです。それは当時のままだったので(証拠として-私はそのようなものが必要でした)今日は関連しています。あなたは長年にわたって物事を行ういくつかの方法が非推奨になり、より現代的なものに置き換える必要があるかもしれないことを知っている必要があります。busyleeが挙げ、本発明の方法の場合ではない異なるコーナー半径を定義するときに、IDEは訴えます。さらに、この質問はGoogle(iirc)での最初のヒットだったので、更新するのは理にかなっています。とにかく、私はSOがもう少しKBのコードを気にしないと確信しています... :)
Dev-iL

2

私はあなたのコードを試してみて、上部の角が丸いボタンを得ました。私が与えた色@ffffffとストロークを与えました#C0C0C0

試す

  1. androidを与える:0ではなくbottomLeftRadius = "0.1dp"。機能しない場合
  2. ドローアブルとエミュレーターの解像度を確認します。resの下に描画可能なフォルダーを作成して使用しました。(hdpi、mdpi ldpi)このXMLがあるフォルダー。これは私の出力です。

ここに画像の説明を入力してください


これはどのAndroidバージョンですか?私のアプリは1.6で実行する必要があります-エミュレータ1.6に問題がありました。
Aleks G 2012

1

これを読む必要があるかもしれませんhttps://developer.android.com/guide/topics/resources/drawable-resource.html#Shape

以下にメモがあります。

注すべてのコーナーには、(最初​​に)1より大きいコーナー半径を指定する必要があります。そうしないと、コーナーが丸められません。特定のコーナーを丸めたくない場合の回避策は、android:radiusを使用してデフォルトのコーナー半径を1より大きい値に設定し、すべてのコーナーを実際に必要な値でオーバーライドしてゼロ( "0dp")を提供することです。 )角を丸くしたくない場合。


1

ドローアブルにroung_top_corners.xmlを作成し、以下のコードをコピーします

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<corners
    android:topLeftRadius="22dp"
    android:topRightRadius="22dp"
    android:bottomLeftRadius="0dp"
    android:bottomRightRadius="0dp"
    />
<gradient
    android:angle="180"
    android:startColor="#1d2b32"
    android:centerColor="#465059"
    android:endColor="#687079"
    android:type="linear" />
<padding
    android:left="0dp"
    android:top="0dp"
    android:right="0dp"
    android:bottom="0dp"
    />
<size
    android:width="270dp"
    android:height="60dp"
    /></shape>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.