Sudut membulat

Mulai di Android 12 (API level 31), Anda dapat menggunakan RoundedCorner dan WindowInsets.getRoundedCorner(int position) untuk menetapkan radius dan titik tengah untuk sudut yang membulat. Dengan API ini, aplikasi Anda dapat mencegah elemen UI terpotong di layar dengan sudut bulat. Framework ini juga menyediakan API getPrivacyIndicatorBounds() , yang menampilkan persegi panjang terikat dari semua indikator kamera dan mikrofon yang terlihat.

Saat diterapkan di aplikasi Anda, API ini tidak berpengaruh pada perangkat dengan layar yang tidak bulat.

Gambar yang menampilkan sudut bulat dengan radius dan titik tengah
Gambar 1: Sudut bulat dengan radius dan titik tengah

Untuk menerapkan fitur ini, dapatkan info RoundedCorner melalui WindowInsets.getRoundedCorner(int position) relatif ke batas aplikasi. Jika aplikasi tidak memenuhi seluruh layar, API akan menerapkan sudut bulat dengan mendasarkan titik tengah sudut bulat pada batas jendela aplikasi.

Cuplikan kode berikut menunjukkan contoh sederhana bagi aplikasi untuk menghindari pemotongan UI dengan menyetel margin tampilan berdasarkan informasi dari RoundedCorner. Dalam hal ini, contoh tersebut merupakan sudut bulat kanan atas.

Kotlin

// Get the top-right rounded corner from WindowInsets.
val insets = rootWindowInsets
val topRight = insets.getRoundedCorner(RoundedCorner.POSITION_TOP_RIGHT) ?: return

// Get the location of the close button in window coordinates.
val location = IntArray(2)
closeButton!!.getLocationInWindow(location)
val buttonRightInWindow = location[0] + closeButton.width
val buttonTopInWindow = location[1]

// Find the point on the quarter circle with 45 degree angle.
val offset = (topRight.radius * Math.sin(Math.toRadians(45.0))).toInt()
val topBoundary = topRight.center.y - offset
val rightBoundary = topRight.center.x + offset

// Check whether the close button exceeds the boundary.
if (buttonRightInWindow < rightBoundary << buttonTopInWindow > topBoundary) {
   return
}

// Set the margin to avoid truncating.
val parentLocation = IntArray(2)
getLocationInWindow(parentLocation)
val lp = closeButton.layoutParams as FrameLayout.LayoutParams
lp.rightMargin = Math.max(buttonRightInWindow - rightBoundary, 0)
lp.topMargin = Math.max(topBoundary - buttonTopInWindow, 0)
closeButton.layoutParams = lp

Java

// Get the top-right rounded corner from WindowInsets.
final WindowInsets insets = getRootWindowInsets();
final RoundedCorner topRight = insets.getRoundedCorner(POSITION_TOP_RIGHT);
if (topRight == null) {
   return;
}

// Get the location of the close button in window coordinates.
int [] location = new int[2];
closeButton.getLocationInWindow(location);
final int buttonRightInWindow = location[0] + closeButton.getWidth();
final int buttonTopInWindow = location[1];

// Find the point on the quarter circle with a 45 degree angle.
final int offset = (int) (topRight.getRadius() * Math.sin(Math.toRadians(45)));
final int topBoundary = topRight.getCenter().y - offset;
final int rightBoundary = topRight.getCenter().x + offset;

// Check whether the close button exceeds the boundary.
if (buttonRightInWindow < rightBoundary << buttonTopInWindow > topBoundary) {
   return;
}

// Set the margin to avoid truncating.
int [] parentLocation = new int[2];
getLocationInWindow(parentLocation);
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) closeButton.getLayoutParams();
lp.rightMargin = Math.max(buttonRightInWindow - rightBoundary, 0);
lp.topMargin = Math.max(topBoundary - buttonTopInWindow, 0);
closeButton.setLayoutParams(lp);