programing

Android "상승"이 그림자를 나타내지 않음

itmemos 2023. 8. 20. 10:19
반응형

Android "상승"이 그림자를 나타내지 않음

ListView가 있으며 각 목록 항목에 대해 아래에 그림자가 표시되도록 합니다.나는 Android Rollipop의 새로운 상승 기능을 사용하여 그림자를 드리우고 싶은 보기에 Z를 설정하고 있으며, 이미 작업 표시줄(Rollipop의 도구 모음)을 사용하여 이 작업을 효과적으로 수행하고 있습니다.롤리팝의 상승을 사용하고 있는데, 어떤 이유에서인지 목록 항목 아래에 그림자가 표시되지 않습니다.각 목록 항목의 레이아웃을 설정하는 방법은 다음과 같습니다.

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

목록 은 다음과 같습니다: 나그림없목항표방다같다습음니과법은는시하을그목러.enter image description here

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

  1. 표고를 상위 레이아웃 대신 ImageView 및 TextView 자체로 설정합니다.
  2. 이미지 보기에 배경을 적용했습니다.
  3. 표고 대신 변환 Z를 사용했습니다.

저는 롤리팝에서 그림자를 가지고 놀았고 이것이 제가 발견한 것입니다.

  1. 가 있는 것 .ViewGroup의 경계는 어떤 이유에서인지 아이들의 그림자를 차단합니다.
  2. 으로 장식된 그림자.android:elevation는 에의차니다됩단해▁the에 의해 됩니다.View; '의 경계';
  3. 하고 자식보에그림표를올시방는바부법른다패것설입니설정정고는하하딩을모에은서를 설정하는 것입니다.android:clipToPadding="false"그 부모에게.

제가 알고 있는 것을 바탕으로 당신에게 제안합니다.

  1. 을 설정RelativeLayout음영을 표시할 상대 레이아웃에 설정한 여백과 동일한 패딩을 사용합니다.
  2. android:clipToPadding="false" 편에RelativeLayout;
  3. 에서 여백을 제거합니다.RelativeLayout.
  4. [EDIT] 표고가 필요한 하위 레이아웃에 투명하지 않은 배경색을 설정해야 할 수도 있습니다.

최종적으로 최상위 상대 레이아웃은 다음과 같습니다.

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

기본적으로 그림자는 보기의 배경에 따라 결정되므로 배경이 없는 경우 그림자도 없습니다.

보기에서 표고를 설정하여 표시할 수는 없습니다.배경도 지정해야 합니다.

선형 레이아웃에 추가된 다음 선이 마침내 그림자를 표시했습니다.

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

매니페스트에 이 선이 있으면 그림자가 표시되지 않는다는 점에 유의해야 합니다.

Android:하드웨어Accelerated="false"

저는 제안된 모든 것을 시도했지만, 제가 라인을 제거했을 때만 효과가 있었습니다. 제가 라인을 가지고 있었던 이유는 제 앱이 여러 비트맵 이미지로 작동하고 그것들이 앱을 손상시켰기 때문입니다.

배경이 없는 보기가 있는 경우 이 선이 도움이 됩니다.

android:outlineProvider="bounds"

배경이 있는 보기가 있는 경우 이 선이 도움이 됩니다.

android:outlineProvider="paddedBounds"

버튼 요소에 표고를 추가하는 경우 다음 행을 추가해야 합니다.

android:stateListAnimator="@null"

Android 5.0 Android: elevation은 View에는 효과가 있지만 Button에는 효과가 없습니까?

이걸 알아내려고 한 시간밖에 안 걸렸어요저 같은 경우는 배경화면이 있었는데 색상으로 설정이 되어 있었습니다.이것만으로는 충분하지 않습니다. 뷰 배경을 그리기 가능으로 설정해야 합니다.

예: 그림자가 없습니다.

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

표고가 제대로 작동하지 않습니다. 그러면 전화기의 색 설정을 수정해 볼 수 있습니다.

은 끔은가처럼.background="@color/***"또는background="#ff33**"일이 아니라, 내가 대신합니다.background_color드로잉 가능한 경우, 작동합니다.

한 배경과 ▁youground▁have▁to▁if▁wantrent그▁and고▁back리싶면다만.android:outlineProvider="bounds". 사용자 보기를 할 수 있습니다. 사용자 정의 보기를 만들 수 있습니다.개요 제공업체:

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

[EDIT] 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으로 Alpha DDx0/FFx0 == 0.86인 StateListDrawable인 경우

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

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

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

그래도 고도가 표시되지 않으면 시도해 보십시오.

    android:hardwareAccelerated="true" 

이것은 분명히 당신에게 도움이 될 것입니다.

고도를 설정하는 저에게는 배경과 여백이 매력적으로 작용했습니다.

android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:background="@drawable/card_view" //any drawable or color
android:elevation="4dp"

나는 운이 좋게도 세팅을 했습니다.clipChildren="false"상위 레이아웃에 있습니다.

시간을 들여 작업을 해보니 배경이 어두우면 그림자가 보이지 않는다는 것을 알게 되었습니다.

또한 해당 보기에서 알파를 변경하지 않는지 확인합니다.일부 뷰에서 알파를 변경할 때 발생하는 문제를 표고와 함께 조사하고 있습니다.알파가 1f로 변경되고 다시 변경될 때 그들은 단순히 상승을 완화합니다.

상위 항목을 채우는 상대 레이아웃에 표고 요소를 적용했기 때문에 문제가 발생했다고 생각합니다.상위 뷰는 자체 도면 캔버스 내의 모든 하위 뷰를 클리핑합니다(및 하위 섀도를 처리하는 뷰입니다).맨 위에 표고 특성을 적용하여 이 문제를 해결할 수 있습니다.RelativeLayoutxml(루트 태그) 보기에 표시됩니다.

저의 경우 글꼴이 문제였습니다.

미포함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" />

와 함께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);

이 라인을 제거하는 것이 효과가 있었습니다.아니면 애초에 왜 이것이 존재하는지 평가할 필요가 있습니다.저의 경우 허니콤을 지원하기 위한 것이었는데, 허니콤은 현재 제 프로젝트의 최소 SDK보다 훨씬 뒤쳐져 있습니다.

clipChildren과 clipToPadding을 부모 레이아웃에 모두 설정하는 것이 제 역할을 했습니다.

android:clipChildren="false"
android:clipToPadding="false"

상단 상대 레이아웃에서 rodroid:clipToPadding="false"를 설정하면 문제가 해결되었습니다.

레이아웃 또는 보기에 배경색 설정

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

반응형