그림자가 표시되지 않는 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>
그러나 그림자없이 목록 항목을 표시하는 방법은 다음과 같습니다.
또한 다음을 시도했지만 아무 소용이 없었습니다.
- 부모 레이아웃 대신 높이를 ImageView 및 TextViews로 설정하십시오.
- ImageView에 배경을 적용했습니다.
- 고도 대신에 TranslationZ를 사용했습니다.
나는 롤리팝에서 그림자를 가지고 놀고 있었고 이것이 내가 찾은 것입니다.
ViewGroup
어떤 이유로 부모 의 경계는 자녀의 그림자를 차단하는 것으로 보입니다 . 과- 으로 설정된 그림자
android:elevation
는View
경계를 벗어나는 경계가 아니라 경계에 의해 잘립니다. - 자식보기에 그림자를 표시하는 올바른 방법은 부모에 패딩을 설정
android:clipToPadding="false"
하고 해당 부모에 설정 하는 것입니다.
내가 아는 것을 기반으로 당신에게 내 제안은 다음과 같습니다.
RelativeLayout
그림자를 표시하려는 상대 레이아웃에서 설정 한 여백과 같은 패딩을 갖도록 최상위 레벨 을 설정하십시오 .android:clipToPadding="false"
동일하게 설정RelativeLayout
;RelativeLayout
입면도 설정되어 있는 여백을 제거하십시오 .- [편집] 고도가 필요한 자식 레이아웃에서 불투명 한 배경색을 설정해야 할 수도 있습니다.
하루가 끝나면 최상위 상대 레이아웃은 다음과 같아야합니다.
<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
'IT story' 카테고리의 다른 글
MyISAM과 InnoDB의 차이점은 무엇입니까? (0) | 2020.04.05 |
---|---|
break 문과 continue 문의 차이점 (0) | 2020.04.05 |
Mac OS X Lion에서 PHP.ini는 어디에 있습니까? (0) | 2020.04.05 |
PHP에서 분 단위의 시차를 얻는 방법 (0) | 2020.04.05 |
github에서 모든 커밋 기록을 삭제하는 방법은 무엇입니까? (0) | 2020.04.05 |