Tôi muốn xác định thứ tự z cho các lượt xem của RelativeLayout trong Android.
Tôi biết một cách để làm điều này là gọi bringToFront
.
Có cách nào tốt hơn để làm điều này? Sẽ thật tuyệt nếu tôi có thể xác định thứ tự z trong bố cục xml.
Tôi muốn xác định thứ tự z cho các lượt xem của RelativeLayout trong Android.
Tôi biết một cách để làm điều này là gọi bringToFront
.
Có cách nào tốt hơn để làm điều này? Sẽ thật tuyệt nếu tôi có thể xác định thứ tự z trong bố cục xml.
Câu trả lời:
Cách đơn giản nhất chỉ đơn giản là chú ý đến thứ tự các Chế độ xem được thêm vào tệp XML của bạn. Thấp hơn trong tệp có nghĩa là cao hơn trong trục Z.
Chỉnh sửa: Điều này được ghi lại ở đây và ở đây trên trang web của nhà phát triển Android. (Cảm ơn @flightplanner)
Xin lưu ý, các nút và các thành phần khác trong API 21 trở lên có độ cao lớn và do đó bỏ qua thứ tự xml của các phần tử bất kể bố cục chính. Mất một lúc để tìm ra cái đó.
Trong Android bắt đầu từ API cấp 21, các mục trong tệp bố cục nhận được thứ tự Z của chúng cả từ cách chúng được sắp xếp trong tệp, như được mô tả trong câu trả lời đúng và từ độ cao của chúng, giá trị độ cao cao hơn có nghĩa là mục đó có thứ tự Z cao hơn .
Điều này đôi khi có thể gây ra sự cố, đặc biệt là với các nút thường xuất hiện trên đầu các mục theo thứ tự của XML phải ở dưới chúng theo thứ tự Z. Để khắc phục điều này, chỉ cần đặtandroid:elevation
mục trong XML bố cục của bạn khớp với thứ tự Z bạn muốn đạt được.
Nếu bạn đặt độ cao của một phần tử trong bố cục, nó sẽ bắt đầu tạo bóng. Nếu bạn không muốn hiệu ứng này, bạn có thể xóa bóng bằng mã như vậy:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
myView.setOutlineProvider(null);
}
Tôi chưa tìm thấy cách nào để loại bỏ bóng của chế độ xem nâng cao thông qua bố cục xml.
android:elevation="1000dp"
. Không có bóng được kết xuất theo cách này.
Tôi gặp phải cùng một vấn đề: Trong một bố cục tương đối, tôi có 2 con childView1 và childView2. Đầu tiên, tôi đặt childView1 trên childView2 và tôi muốn childView1 nằm trên đầu của childView2. Thay đổi thứ tự quan điểm của trẻ em không giải quyết được vấn đề cho tôi. Điều làm việc cho tôi là đặt android: clipChildren = "false" trên ParentView và trong mã tôi đặt:
childView1.bringToFront();
parentView.invalidate();
child.bringToFront()
với parent.invalidate()
các tác phẩm, nhưng parent.bringChildToFront(child)
không. Đâu là logic mà tất cả chúng ta mong đợi từ một hệ điều hành?
android:clipChildren="false"
đã làm được mẹo. Cảm ơn bạn!
Tôi nghĩ rằng tôi sẽ thêm một câu trả lời kể từ khi giới thiệu
android: dịchZ
Trường XML đã thay đổi mọi thứ một chút. Các câu trả lời khác đề nghị chạy
childView1.bringToFront();
parentView.invalidate();
Chúng tôi hoàn toàn chú ý đến EXCEPT vì mã này sẽ KHÔNG đưa childView1 ra trước bất kỳ chế độ xem nào với android được mã hóa cứng: dịchZ trong tệp XML. Tôi đã gặp vấn đề với điều này và một khi tôi đã xóa trường này khỏi các chế độ xem khác, bringToFront () hoạt động tốt.
elevation
API 21 đã view.setElevation(float)
tích hợp sẵn
Sử dụng ViewCompat.setElevation(view, float);
để tương thích ngược
Thêm phương pháp ViewCompat.setZ(v, pixels)
vàViewCompat.setTranslationZ(v, pixels)
Một cách khác để thu thập các nút hoặc xem mảng và sử dụng addView
để thêm vào RelativeLayout
childView.bringToFront () không hoạt động đối với tôi, vì vậy tôi đã đặt bản dịch Z của mục ít được thêm gần đây nhất (mục được phủ lên tất cả các phần tử khác) thành giá trị âm như vậy:
lastView.setTranslationZ(-10);
xem https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) để biết thêm
Bạn có thể sử dụng tùy chỉnh RelativeLayout
với định nghĩa lại
protected int getChildDrawingOrder (int childCount, int i)
Hãy lưu ý - phương pháp này lấy param i
là "tôi nên vẽ chế độ xem nào i'th
". Đây là cách làm ViewPager
việc. Nó đặt thứ tự bản vẽ tùy chỉnh trong kết hợp với PageTransformer
.
Kiểm tra xem bạn có bất kỳ độ cao nào trên một trong các Chế độ xem trong XML không. Nếu vậy, thêm độ cao cho các mục khác hoặc loại bỏ độ cao để giải quyết vấn đề. Từ đó, đó là thứ tự của các quan điểm chỉ ra những gì xuất hiện trên các quan điểm khác.