IT story

그림자가 표시되지 않는 Android“고도”

hot-time 2020. 4. 5. 20:37
반응형

그림자가 표시되지 않는 Android“고도”


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를 사용했습니다.

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

  1. ViewGroup어떤 이유로 부모 의 경계는 자녀의 그림자를 차단하는 것으로 보입니다 .
  2. 으로 설정된 그림자 android:elevationView경계를 벗어나는 경계가 아니라 경계에 의해 잘립니다.
  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"
    >

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

android:outlineProvider="bounds"

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


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

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

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

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

android : hardwareAccelerated = "false"

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


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

android:outlineProvider="bounds"

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

android:outlineProvider="paddedBounds"

버튼 요소에 입면도를 추가하는 경우 다음 선을 추가해야합니다.

android:stateListAnimator="@null"

참조 고도보기위한 작품,하지만 버튼 : 안드로이드 5.0 안드로이드를?


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

예 : 그림자가 없습니다 :

<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>

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

<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"

    />

투명한 배경을 원하고 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));

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


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

    android:hardwareAccelerated="true" 

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


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

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

허용 된 답변에 덧붙여 상승이 예상대로 작동하지 않을 수있는 또 다른 이유가 있습니다.

전화기의 Bluelight 필터 기능이 켜져있는 경우

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

설정 후에도

android:outlineProvider="bounds"

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


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


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


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

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" />

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


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

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

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

참고 URL : https://stackoverflow.com/questions/27477371/android-elevation-not-showing-a-shadow

반응형