답변:
가장 쉬운 방법은보기가 XML 파일에 추가되는 순서에주의를 기울이는 것입니다. 파일에서 아래로 내려 가면 Z 축에서 더 높아집니다.
편집 : 여기 및 여기 에 Android 개발자 사이트에 설명되어 있습니다. (감사합니다 @flightplanner)
API 레벨 21부터 Android에서 레이아웃 파일의 항목은 정답에 설명 된대로 파일 내에서 항목이 정렬되는 방식과 높이에서 Z 순서를 가져옵니다. 표고가 높을수록 항목이 Z 순서가 높아짐을 의미합니다. .
특히 XML 순서에 따라 Z 순서로 아래에 있어야하는 항목 위에 나타나는 단추의 경우 특히 문제가 발생할 수 있습니다. 이 문제를 해결하려면 android:elevation
레이아웃 XML의 항목 중 원하는 Z 순서와 일치하도록 항목을 설정하십시오 .
레이아웃에서 요소의 높이를 설정하여 그림자를 드리 우기 시작합니다. 이 효과를 원하지 않으면 다음과 같이 코드로 그림자를 제거 할 수 있습니다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
myView.setOutlineProvider(null);
}
레이아웃 XML을 통해 상승 된보기의 그림자를 제거하는 방법을 찾지 못했습니다.
android:elevation="1000dp"
. 이 방법으로 그림자가 렌더링되지 않습니다.
같은 문제가 발생했습니다. 상대 레이아웃 parentView에는 childView1과 childView2라는 두 자녀가 있습니다. 처음에는 childView1을 childView2 위에 놓고 childView1을 childView2 위에 놓기를 원합니다. 어린이보기의 순서를 변경해도 문제가 해결되지 않았습니다. 나를 위해 일한 것은 parentView 와 내가 설정 한 코드에서 android : clipChildren = "false" 를 설정하는 것입니다.
childView1.bringToFront();
parentView.invalidate();
child.bringToFront()
함께 parent.invalidate()
작동하지만 parent.bringChildToFront(child)
하지 않습니다. 우리 모두 OS에서 기대하는 논리는 어디에 있습니까?
android:clipChildren="false"
트릭을 수행했습니다. 감사합니다!
도입 이후 답변을 추가 할 것이라고 생각했습니다.
안드로이드 : 번역 Z
XML 필드가 조금 바뀌었다. 달리기를 제안하는 다른 답변들
childView1.bringToFront();
parentView.invalidate();
이 코드는 childView1을 XML 파일의 하드 코딩 된 android : translationZ가있는 뷰 앞에 가져 가지 않습니다. 나는 이것에 문제가 있었고 다른보기 에서이 필드를 제거하면 bringToFront ()가 잘 작동했습니다.
elevation
childView.bringToFront ()는 저에게 효과적이지 않으므로 가장 최근에 추가 된 항목 (다른 모든 자식을 오버레이 한 항목)의 Z 변환을 음수 값으로 설정했습니다.
lastView.setTranslationZ(-10);
자세한 내용은 https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) 를 참조 하십시오.
RelativeLayout
재정의 된 사용자 정의 를 사용할 수 있습니다
protected int getChildDrawingOrder (int childCount, int i)
이 방법은 i
"어떤 뷰를 그려야합니까?"라는 매개 변수 를 사용합니다 i'th
. 이것이 ViewPager
작동 하는 방식입니다. 와 함께 사용자 지정 도면 순서를 설정합니다 PageTransformer
.