그림자가 보이지 않는 Android“고도”


273

ListView가 있고 각 목록 항목과 함께 그 아래에 그림자를 표시하려고합니다. Android Lollipop의 새로운 고도 기능을 사용하여 그림자를 드리 우고 자하는 뷰에서 Z를 설정하고 이미 ActionBar (기술적으로 Lollipop의 툴바)를 사용하여이를 효과적으로하고 있습니다. Lollipop의 고도를 사용하고 있지만 어떤 이유로 든 목록 항목 아래에 그림자가 표시되지 않습니다. 각 목록 항목의 레이아웃을 설정하는 방법은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    style="@style/block"
    android:gravity="center"
    android:layout_gravity="center"
    android:background="@color/lightgray"
    >

    <RelativeLayout
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_marginLeft="40dp"
        android:layout_marginRight="40dp"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:elevation="30dp"
        >

        <ImageView
            android:id="@+id/documentImageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop" />

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/alphared"
            android:layout_alignParentBottom="true" >

            <appuccino.simplyscan.Extra.CustomTextView
                android:id="@+id/documentName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@color/white"
                app:typeface="light"
                android:paddingLeft="16dp"
                android:paddingTop="8dp"
                android:paddingBottom="4dp"
                android:singleLine="true"
                android:text="New Document"
                android:textSize="27sp"/>

            <appuccino.simplyscan.Extra.CustomTextView
                android:id="@+id/documentPageCount"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@color/white"
                app:typeface="italic"
                android:paddingLeft="16dp"
                android:layout_marginBottom="16dp"
                android:text="1 page"
                android:textSize="20sp"/>

        </LinearLayout>

    </RelativeLayout>

</RelativeLayout>

그러나 그림자없이 목록 항목을 표시하는 방법은 다음과 같습니다. 여기에 이미지 설명을 입력하십시오

또한 다음을 시도했지만 아무 소용이 없었습니다.

  1. 부모 배치 대신 높이를 ImageView 및 TextViews로 설정하십시오.
  2. ImageView에 배경을 적용했습니다.
  3. 고도 대신에 TranslationZ를 사용했습니다.

사용자 정의보기없이 레이아웃을 시도하고 휴대 전화에 그림자를 표시했습니다. 문제를 재현하는 최소한의 프로젝트를 공유 할 수 있습니까?
rnrneverdies


답변:


383

나는 Lollipop에서 그림자를 가지고 놀고 있었고 이것이 내가 찾은 것입니다.

  1. ViewGroup어떤 이유로 부모 의 경계는 자녀의 그림자를 차단하는 것으로 보입니다 . 과
  2. 설정 그림자 android:elevation바이 컷오프이다 View의 경계가 아닌 마진을 확장 경계;
  3. 자식보기에 그림자를 표시하는 올바른 방법은 부모에 패딩을 설정 android:clipToPadding="false"하고 해당 부모에 설정 하는 것입니다.

내가 아는 것을 기반으로 당신에게 내 제안은 다음과 같습니다.

  1. RelativeLayout그림자를 표시하려는 상대 레이아웃에서 설정 한 여백과 같은 패딩을 갖도록 최상위 레벨 을 설정하십시오 .
  2. android:clipToPadding="false"동일하게 설정 RelativeLayout;
  3. RelativeLayout입면도 설정되어 있는 여백을 제거하십시오 .
  4. [편집] 고도가 필요한 자식 레이아웃에서 불투명 한 배경색을 설정해야 할 수도 있습니다.

하루가 끝나면 최상위 상대 레이아웃은 다음과 같아야합니다.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    style="@style/block"
    android:gravity="center"
    android:layout_gravity="center"
    android:background="@color/lightgray"
    android:paddingLeft="40dp"
    android:paddingRight="40dp"
    android:paddingTop="20dp"
    android:paddingBottom="20dp"
    android:clipToPadding="false"
    >

내부 상대 레이아웃은 다음과 같아야합니다.

<RelativeLayout
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:background="[some non-transparent color]"
    android:elevation="30dp"
    >

8
감사합니다! 또한 부모 : 상대 레이아웃에 적용될 때 android : clipChildren = "false"가 유용하다는 것을 알았습니다.
blaffie

1
@blaffie를 도와 주셔서 감사합니다!
저스틴 폴라드

214
구글이 그런 엉뚱한 코드를 만들어내는 것은 매우 성가신 일입니다. 몇 년 동안 이러한 프레임 워크 버그를 고려해야합니다.
miguel

8
Google은 (alas) : " 상위 뷰의 부모에 의해 그림자가 그려 지므로 기본적으로 부모에 의해 클리핑되는 표준 뷰 클리핑이 적용됩니다. "
John

5
제 경우에는 투명한 색이었습니다. 좋아, 투명한 물건은 그림자를 드리 우지 않습니다. haha
Ferran Maylinch

285

배경이없는 뷰가있는 경우이 라인이 도움이됩니다

android:outlineProvider="bounds"

기본적으로 그림자는 뷰의 배경에 의해 결정되므로 배경이 없으면 그림자도 없습니다.


11
이상한 점은 미리보기가 높이를 보였지만 실제 장치는 그렇지 않았습니다. 감사합니다.이 문제가 해결되었습니다.
Ioane Sharvadze

API 레벨 21 이상에서 작동
Pantelis Ieronimakis

10
이런 종류의 나를 위해 일했지만 텍스트보기에 적용 할 때 측면에 대각선 테두리가 생겼습니다. 배경을 색상으로 설정하면 (부모 배경색과 동일) 더 효과적입니다.
Gober

4
배경이 사용자 정의이고없는 경우에도 적용됩니다 <solid>.
David Lord

이것은 반대로 사용될 수 있습니다. 고도가있는 불투명 배경을 원하고 그림자를 원하지 않는 경우. 간단히로 설정하십시오 none. 감사!
Odys

101

분명히 뷰에 입면을 설정하여 표시 할 수는 없습니다. 또한 배경을 지정해야합니다.

LinearLayout에 추가 된 다음 줄은 마침내 그림자를 보여주었습니다.

android:background="@android:color/white"
android:elevation="10dp"

예상치 못한 일이었습니다. src로 ImageView를 설정하고 솔루션을 찾고있었습니다. 감사합니다.
Andrew Grow

47

주의해야 할 또 다른 사항은 매니페스트 에이 줄이 있으면 그림자가 표시되지 않습니다.

android : hardwareAccelerated = "false"

나는 제안 된 것들을 모두 시도했지만 라인을 제거했을 때만 효과가있었습니다. 라인이있는 이유는 내 앱이 여러 비트 맵 이미지로 작동하고 앱이 충돌했기 때문입니다.


1
해당 플래그가 필요한 경우에는 문제가 해결되지 않습니다.
Clive Jefferies 2014 년

감사합니다!! 나는 AppBar를 높이기 위해 하루를
보냈고이

1
가능한 모든 솔루션을 시도했지만 아무런 효과가 없습니다. 이 솔루션은 효과가있었습니다. 감사. android:clipToPadding="false"이 솔루션 도 필요 합니다.
Chirag Savsani

29

배경이없는 뷰가있는 경우이 라인이 도움이됩니다

android:outlineProvider="bounds"

배경이있는 뷰가 있으면이 줄이 도움이 될 것입니다.

android:outlineProvider="paddedBounds"

6
이 솔루션은 나에게 유일한 방법입니다. 감사합니다
Oleh Liskovych

4
뷰 배경에 반경이 없으면 그림자가 직사각형으로 표시되지만 paddedBounds는 배경이있는 뷰에서 작동합니다.
Trevor Hart

android:outlineProvider="paddedBounds"이 라인은 나를 위해 일했습니다. Selector Drawable을 설정했습니다.
Chirag Savsani

1
이것을 사용하면 그림자가 외부가 아닌 뷰 내부에 완전히 그려집니다. 원하는 것이 아닙니다.
androidguy


12

어, 그냥 알아 내기 위해 한 시간을 보냈습니다. 내 경우에는 배경이 설정되었지만 색상으로 설정되었습니다. 이것으로 충분하지 않으므로 뷰의 배경을 드로어 블로 설정해야합니다.

예 : 그림자가 없습니다 :

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="165dp"
    android:background="@color/ight_grey"
    android:elevation="20dp"
    android:orientation="vertical"
    />

그러나 이것은

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="165dp"
    android:background="@drawable/selector_grey"
    android:elevation="20dp"
    android:orientation="vertical"
    />

편집 : 셀렉터를 배경으로 사용하는 경우 모서리를 설정하지 않으면 그림자가 미리보기 창에 표시 되지 않지만 장치에 표시됩니다.

예를 들어 미리보기에 그림자가 없습니다.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
            <stroke
                android:width="1dp"
                android:color="@color/grey"/>
        </shape>
    </item>
</selector>

그러나 이것은 :

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
            <corners android:radius="1dp" />
            <stroke
                android:width="1dp"
                android:color="@color/grey"/>
        </shape>
    </item>
</selector>

1
리사이클 러뷰 (RecyclerView) 아이템에서 당신의 첫 번째 요점과는 정반대입니다. 5 년 동안 전문적인 안드로이드 개발을 한
후에도이

7

배경색을 추가하면 도움이되었습니다.

<CalendarView
    android:layout_width="match_parent"
    android:id="@+id/calendarView"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:layout_height="wrap_content"
    android:elevation="5dp"

    android:background="@color/windowBackground"

    />

4

때로는 좋아 background="@color/***"하거나 background="#ff33**"작동하지 않고 background_color드로어 블로 교체 한 다음 작동합니다.


4

여전히 고도를 표시하지 않으면 시도하십시오

    android:hardwareAccelerated="true" 

이것은 확실히 당신을 도울 것입니다.


이것은 나를 위해 그것을 고쳤다. 나는 TRUE가 기본 설정이라고 가정했지만 적어도 내 경우에는 그렇지 않습니다.
매트 로버트슨

3

투명한 배경을 원하고 android:outlineProvider="bounds"작동하지 않으면 사용자 정의 ViewOutlineProvider를 만들 수 있습니다.

class TransparentOutlineProvider extends ViewOutlineProvider {

    @Override
    public void getOutline(View view, Outline outline) {
        ViewOutlineProvider.BACKGROUND.getOutline(view, outline);
        Drawable background = view.getBackground();
        float outlineAlpha = background == null ? 0f : background.getAlpha()/255f;
        outline.setAlpha(outlineAlpha);
    }
}

그리고이 공급자를 투명보기로 설정하십시오.

transparentView.setOutlineProvider(new TransparentOutlineProvider());

출처 : https://code.google.com/p/android/issues/detail?id=78248#c13

[편집] Drawable.getAlpha ()의 문서는 Drawable이 알파를 어떻게 위협하는지에 따라 다르다고 말합니다. 항상 255를 반환 할 수 있습니다.이 경우 알파를 수동으로 제공 할 수 있습니다.

class TransparentOutlineProvider extends ViewOutlineProvider {

    private float mAlpha;

    public TransparentOutlineProvider(float alpha) {
        mAlpha = alpha;
    }

    @Override
    public void getOutline(View view, Outline outline) {
        ViewOutlineProvider.BACKGROUND.getOutline(view, outline);
        outline.setAlpha(mAlpha);
    }
}

뷰 배경이 기본 색상이 DDFF0000이고 알파 DDx0 / FFx0 == 0.86 인 StateListDrawable 인 경우

transparentView.setOutlineProvider(new TransparentOutlineProvider(0.86f));

2

레이아웃에 배경색을 지정하면 다음과 같이 작동합니다.

    android:background="@color/catskill_white"
    android:layout_height="?attr/actionBarSize"
    android:elevation="@dimen/dimen_5dp"

1

clipChildren="false"부모 레이아웃 설정 에 운이 좋았습니다 .


1

나는 그것에 시간을 보냈고 마침내 배경이 어두울 때 그림자가 보이지 않는다는 것을 깨달았습니다.


1

수락 된 답변에 추가하여 전화기의 Bluelight 필터 기능이 켜져 있으면 고도가 예상대로 작동하지 않을 수있는 또 다른 이유가 있습니다.

고도가 장치에서 완전히 왜곡되어 견딜 수 없을 때이 문제에 직면했습니다. 그러나 미리보기에서는 고도가 양호했습니다. 전화기에서 Bluelight 필터를 끄면 문제가 해결되었습니다.

설정 후에도

android:outlineProvider="bounds"

고도가 제대로 작동하지 않으면 전화기의 색상 설정을 조정 해 볼 수 있습니다.


0

귀하의 문제는 높이 요소를 부모를 채우는 상대 레이아웃에 적용했기 때문에 발생한다고 생각합니다. 부모는 자신의 그리기 캔버스 내에서 모든 자식보기를 자릅니다 (그리고 자식의 그림자를 처리하는보기입니다). RelativeLayout뷰 XML (루트 태그) 의 최상위 에 고도 속성을 적용하여이 문제를 해결할 수 있습니다 .


0

제 경우에는 글꼴이 문제였습니다.

1) 값 fontFamily을 설정 하지 않아도됩니다 android:background.

<TextView
    android:layout_width="match_parent"
    android:layout_height="44dp"
    android:background="@android:color/white"
    android:elevation="3dp"
    android:gravity="center"
    android:text="@string/fr_etalons_your_tickets"
    android:textAllCaps="true"
    android:textColor="@color/blue_4" />

2) 설정 fontFamily을 추가해야했습니다 android:outlineProvider="bounds".

<TextView
    android:fontFamily="@font/gilroy_bold"
    android:layout_width="match_parent"
    android:layout_height="44dp"
    android:background="@android:color/white"
    android:elevation="3dp"
    android:gravity="center"
    android:outlineProvider="bounds"
    android:text="@string/fr_etalons_your_tickets"
    android:textAllCaps="true"
    android:textColor="@color/blue_4" />

0

필자의 경우 렌더링 레이어 유형을 "소프트웨어"로 설정 한 사용자 지정 상위 구성 요소로 인해 발생했습니다.

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

이 라인을 제거하면 트릭이되었습니다. 또는 물론 이것이 왜 존재하는지 평가해야합니다. 필자의 경우 Honeycomb을 지원하는 것이 내 프로젝트의 현재 최소 SDK보다 훨씬 낫습니다.


0

해당 뷰에서 알파를 변경하지 않는지도 확인하십시오. 고도와 함께 일부 뷰에서 알파를 변경할 때 문제를 조사 중입니다. 알파가 변경되고 다시 1f로 변경되면 고도가 느슨해집니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.