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

다음은 셰이프 코너 문제입니다 : code.google.com/p/android/issues/detail?id=939
Knickedi

답변:


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

비트 맵이 주어지면 코드에서 어떻게해야합니까? 그리고 주위에 개요 (AKA 스트로크)를 추가하는 방법은 무엇입니까?
안드로이드 개발자

@Aleks G 나는 그것을 명시 할 필요가 없다고 생각하지 않는다android:radius="1dp"
hmac

@ hmac 필요합니다. 설명서를 읽으면 명확합니다.
Aleks G

@AleksG 그래, 문서가 잘못되어 Samsung 10, Android 9에서 테스트되었습니다. "모든 코너에 (처음에) 코너 반경이 1보다 크거나 그렇지 않으면 코너가 둥글 지 않아야합니다. 특정 코너를 둥글게하지 않으려면 해결 방법은 android : radius를 사용하여 기본 모서리 반경을 1보다 크게 설정 한 다음 재정의하는 것입니다. "-사실이 아님, 오른쪽 아래, 오른쪽 위, 왼쪽 위를 0으로 지정하고 왼쪽 아래 + 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

나는이 접근법을 시도했다. 그것은 받아 들여지지 않는다. ide는 다른 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

9

에 구축 busylee의 대답 이 당신이 할 수있는 방법입니다 drawable하나 개가 그 취소 둥근 모서리를 (이 예에서, 상단 왼쪽) :

<?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되어 있지 안드로이드 스튜디오 미리보기 (2.0.0p7)에서 올바르게 표시합니다. 어쨌든 미리 보려면 다른보기를 만들고 이것을로 사용하십시오 android:background="@drawable/...".


6
@AleksG-물론입니다. 그것은 오늘날과 관련이 있습니다 (증거로-나는 그런 것이 필요했습니다). 수년 동안 일을하는 몇 가지 방법은 더 이상 사용되지 않으며보다 현대적인 방법으로 바꿔야 할 수도 있습니다. 마찬가지로 busylee가 한 본 방법이 아니다 다른 코너 반경을 형성 할 때, IDE 불평. 또한이 질문은 Google (iirc)에 대한 첫 번째 질문이므로 업데이트하는 것이 합리적이었습니다. 어쨌든, 나는 더 많은 코드의 KB를 신경 쓰지 않을 것이라고 확신합니다 ... :)
Dev-iL

2

나는 당신의 코드를 시도하고 둥근 모서리 버튼을 얻었습니다. 나는 색상 @ffffff과 스트로크를 주었다#C0C0C0 .

시험

  1. 안드로이드 제공 : 0 대신 bottomLeftRadius = "0.1dp"
  2. 드로어 블과 에뮬레이터의 해상도를 확인하십시오. res 아래에 drawable 폴더를 만들고 사용했습니다. (hdpi, mdpi ldpi)이 XML이있는 폴더입니다. 이것은 내 출력입니다.

여기에 이미지 설명을 입력하십시오


이것은 어떤 안드로이드 버전입니까? 내 응용 프로그램은 1.6에서 실행되어야하며 에뮬레이터 1.6에 문제가 있습니다.
Aleks G

1

https://developer.android.com/guide/topics/resources/drawable-resource.html#Shape를 읽어보십시오.

그리고 아래에 메모가 있습니다.

참고 모든 코너는 (처음에) 코너 반경이 1보다 커야합니다. 특정 모서리를 반올림하지 않으려면 해결 방법은 android : radius를 사용하여 기본 모서리 반경을 1보다 크게 설정 한 다음 각 모서리를 모두 원하는 값으로 재정 의하여 0 ( "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.