안드로이드에서 다른 뷰 위에 뷰 배치 / 겹침 (z-index)
선형 레이아웃에서 imageview 및 textview로 구성된 선형 레이아웃이 있습니다.
<LinearLayout android:orientation="horizontal" ... >
<ImageView
android:id="@+id/thumbnail"
android:layout_weight="0.8"
android:layout_width="0dip"
android:layout_height="fill_parent">
</ImageView>
<TextView
android:id="@+id/description"
android:layout_weight="0.2"
android:layout_width="0dip"
android:layout_height="wrap_content">
</TextView>
일부 규칙이 누락되었을 수 있습니다. 레이아웃에 대한 아이디어를 제공하는 것입니다. 길이와 너비가 50dip 인 또 다른 작은 텍스트보기를 원하고 imageview 위에 배치하면 "over"라는 말은 imageview보다 z-index 이상을 의미합니다. 이미지 뷰의 중앙과 위 (중첩)에 배치하고 싶습니다.
다양한 z- 인덱스 (선형 레이아웃에서)를 사용하여 한 뷰를 다른 뷰 위에 배치하는 방법을 알고 싶습니다.
이를 위해 LinearLayout을 사용할 수 없지만을 사용할 수 있습니다 FrameLayout
. (A)에 FrameLayout
, Z 축 인덱스 항목은, 예를 들면, 추가 된 순서에 의해 정의된다 :
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/my_drawable"
android:scaleType="fitCenter"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center"
android:padding="5dp"
android:text="My Label"
/>
</FrameLayout>
이 경우 TextView는 이미지의 맨 아래 중앙을 따라 ImageView 위에 그려집니다.
시도해보십시오 .bringToFront()
:
http://developer.android.com/reference/android/view/View.html#bringToFront%28%29
RelativeLayout은 동일한 방식으로 작동하며 상대 레이아웃의 마지막 이미지가 이깁니다.
추첨 순서 변경
대안은 부모가 뷰를 그리는 순서를 변경하는 것입니다. setChildrenDrawingOrderEnabled (true) 를 호출 하고 getChildDrawingOrder (int childCount, int i)를 재정 의하여 ViewGroup에서이 기능을 활성화 할 수 있습니다 .
예:
/**
* Example Layout that changes draw order of a FrameLayout
*/
public class OrderLayout extends FrameLayout {
private static final int[][] DRAW_ORDERS = new int[][]{
{0, 1, 2},
{2, 1, 0},
{1, 2, 0}
};
private int currentOrder;
public OrderLayout(Context context) {
super(context);
setChildrenDrawingOrderEnabled(true);
}
public void setDrawOrder(int order) {
currentOrder = order;
invalidate();
}
@Override
protected int getChildDrawingOrder(int childCount, int i) {
return DRAW_ORDERS[currentOrder][i];
}
}
산출:
OrderLayout#setDrawOrder(int)
0-1-2로 전화하면 다음 과 같은 결과가 발생합니다.
view.setZ(float)
API 레벨 21부터 사용할 수 있습니다 . 여기에서 자세한 정보를 찾을 수 있습니다.
android:elevation="1dp"
다른 뷰보다 원하는 뷰를 추가하여 동일한 문제를 해결 했습니다. 그러나 5.0 미만으로 표시 할 수 없으며 그림자가 약간 생겨 수락 할 수 있으면 괜찮습니다.
따라서 @kcoppock이 가장 올바른 해결책이라고 말했습니다.
RelativeLayout에서 이것을 시도하십시오 :
ImageView image = new ImageView(this);
image.SetZ(float z);
그것은 나를 위해 작동합니다.
LinearLayout을 사용하는 방법이 있습니다. 이전 요소의 marginTop을 해당 음수 값으로 설정하고 맨 위에 원하는 요소가 XML에서 아래에 원하는 요소 뒤에 있는지 확인하십시오.
<linearLayout android:orientation="horizontal" ... >
<ImageView
android:id="@+id/thumbnail"
android:layout_weight="0.8"
android:layout_width="0dip"
android:layout_height="fill_parent"
>
</ImageView>
<TextView
android:id="@+id/description"
android:layout_marginTop="-20dip"
android:layout_weight="0.2"
android:layout_width="0dip"
android:layout_height="wrap_content"
>
</TextView>
AFAIK 선형 레이아웃으로는 할 수 없으므로 RelativeLayout해야 합니다.
'IT story' 카테고리의 다른 글
변수 만 참조로 전달해야합니다 (0) | 2020.04.26 |
---|---|
'adb'는 내부 또는 외부 명령, 작동 가능한 프로그램 또는 배치 파일로 인식되지 않습니다. (0) | 2020.04.26 |
Java에서 문자열 배열을 문자열로 변환 (0) | 2020.04.26 |
레일스 원시 SQL 예제 (0) | 2020.04.26 |
종횡비를 유지하면서 div 크기를 반응 적으로 변경 (0) | 2020.04.26 |