script-astra/Android/Sdk/sources/android-35/android/view/WindowMetrics.java

166 lines
6.0 KiB
Java
Raw Normal View History

2025-01-20 15:15:20 +00:00
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.view;
import android.annotation.NonNull;
import android.graphics.Point;
import android.graphics.Rect;
import java.util.function.Supplier;
/**
* Metrics about a Window, consisting of the bounds and {@link WindowInsets}.
* <p>
* This is usually obtained from {@link WindowManager#getCurrentWindowMetrics()} and
* {@link WindowManager#getMaximumWindowMetrics()}.
* </p>
* After {@link android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE}, it also provides density.
* <h3>Obtains Window Dimensions in Density-independent Pixel(DP)</h3>
* <p>
* While {@link #getDensity()} is provided, the dimension in density-independent pixel could also be
* calculated with {@code WindowMetrics} properties, which is similar to
* {@link android.content.res.Configuration#screenWidthDp}
* <pre class="prettyprint">
* float widthInDp = windowMetrics.getBounds().width() / windowMetrics.getDensity();
* float heightInDp = windowMetrics.getBounds().height() / windowMetrics.getDensity();
* </pre>
* Also, the density in DPI can be obtained by:
* <pre class="prettyprint">
* float densityDp = DisplayMetrics.DENSITY_DEFAULT * windowMetrics.getDensity();
* </pre>
* </p>
*
* @see WindowInsets#getInsets(int)
* @see WindowManager#getCurrentWindowMetrics()
* @see WindowManager#getMaximumWindowMetrics()
*/
public final class WindowMetrics {
@NonNull
private final Rect mBounds;
private WindowInsets mWindowInsets;
private Supplier<WindowInsets> mWindowInsetsSupplier;
/** @see android.util.DisplayMetrics#density */
private final float mDensity;
/** @deprecated use {@link #WindowMetrics(Rect, WindowInsets, float)} instead. */
@Deprecated
public WindowMetrics(@NonNull Rect bounds, @NonNull WindowInsets windowInsets) {
this(bounds, windowInsets, 1.0f);
}
/**
* The constructor to create a {@link WindowMetrics} instance.
* <p>
* Note that in most cases {@link WindowMetrics} is obtained from
* {@link WindowManager#getCurrentWindowMetrics()} or
* {@link WindowManager#getMaximumWindowMetrics()}.
* </p>
*
* @param bounds The window bounds
* @param windowInsets The {@link WindowInsets} of the window
* @param density The window density
*/
public WindowMetrics(@NonNull Rect bounds, @NonNull WindowInsets windowInsets, float density) {
mBounds = bounds;
mWindowInsets = windowInsets;
mDensity = density;
}
/**
* Similar to {@link #WindowMetrics(Rect, WindowInsets, float)} but the window insets are
* computed when {@link #getWindowInsets()} is first time called. This reduces unnecessary
* calculation and the overhead of obtaining insets state from server side because most
* callers are usually only interested in {@link #getBounds()}.
*
* @hide
*/
public WindowMetrics(@NonNull Rect bounds, @NonNull Supplier<WindowInsets> windowInsetsSupplier,
float density) {
mBounds = bounds;
mWindowInsetsSupplier = windowInsetsSupplier;
mDensity = density;
}
/**
* Returns the bounds of the area associated with this window or {@code UiContext}.
* <p>
* <b>Note that the size of the reported bounds can have different size than
* {@link Display#getSize(Point)}.</b> This method reports the window size including all system
* bar areas, while {@link Display#getSize(Point)} reports the area excluding navigation bars
* and display cutout areas. The value reported by {@link Display#getSize(Point)} can be
* obtained by using:
* <pre class="prettyprint">
* final WindowMetrics metrics = windowManager.getCurrentWindowMetrics();
* // Gets all excluding insets
* final WindowInsets windowInsets = metrics.getWindowInsets();
* Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()
* | WindowInsets.Type.displayCutout());
*
* int insetsWidth = insets.right + insets.left;
* int insetsHeight = insets.top + insets.bottom;
*
* // Legacy size that Display#getSize reports
* final Rect bounds = metrics.getBounds();
* final Size legacySize = new Size(bounds.width() - insetsWidth,
* bounds.height() - insetsHeight);
* </pre>
* </p>
*
* @return window bounds in pixels.
*/
@NonNull
public Rect getBounds() {
return mBounds;
}
/**
* Returns the {@link WindowInsets} of the area associated with this window or
* {@code UiContext}.
*
* @return the {@link WindowInsets} of the visual area.
*/
@NonNull
public WindowInsets getWindowInsets() {
if (mWindowInsets != null) {
return mWindowInsets;
}
return mWindowInsets = mWindowInsetsSupplier.get();
}
/**
* Returns the density of the area associated with this window or {@code UiContext},
* which uses the same units as {@link android.util.DisplayMetrics#density}.
*
* @see android.util.DisplayMetrics#DENSITY_DEFAULT
* @see android.util.DisplayMetrics#density
*/
public float getDensity() {
return mDensity;
}
@Override
public String toString() {
return WindowMetrics.class.getSimpleName() + ":{"
+ "bounds=" + mBounds
+ ", windowInsets=" + mWindowInsets
+ ", density=" + mDensity
+ "}";
}
}