Cómo configurar las esquinas y los bordes redondeados de la ventana
[java] ver copia simple
@Override
public void onAttachedToWindow() {
super .Gravity = Gravity.CENTER;
lp.width = (dm.widthPixels * 4) / 5
lp.height = (dm.widthPixels * 4) / 5;
getWindowManager().updateViewLayout(view, lp);
getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); view.
p>
Las dos publicaciones de blog anteriores discutieron las razones para modificar el tamaño de la ventana en onAttachedToWindow y la relación entre la ventana y la vista decorativa. Esta publicación de blog resolverá la lógica del código de. la implementación de esquinas redondeadas.
La idea organizativa es:
Obtener el tamaño de la pantalla y luego calcular el tamaño de la ventana Actividad según las necesidades. El teléfono móvil predeterminado aquí es la pantalla vertical, y la altura y el ancho de la Actividad están configurados en 4/5 del ancho de la pantalla.
Obtenga la variable DecorView de PhoneWindow y luego modifique DecorView LayoutParams para modificar el tamaño de la ventana.
Configura el fondo de PhoneWindow en transparente.
Establezca el fondo de DecorView en esquinas redondeadas con un borde.
El primer paso es obtener el alto y ancho de la pantalla a través de los DisplayMetrics de uso común.
El segundo paso es obtener la vista decorativa del formulario a través de getWindow().getDecorView(), y luego obtener los parámetros de diseño, pero los parámetros de diseño de la vista decorativa son WindowManager.LayoutParams.¡Nota! De acuerdo con el análisis de la posición y el uso de onAttachedToWindow () en todo el ciclo de vida de la Actividad en el blog anterior, asegúrese de obtener WindowManager.LayoutParams en onAttachedToWindow; de lo contrario, el obtenido estará vacío.
El tercer paso es llamar directamente a la interfaz setBackgroundDrawable de PhoneWindow para configurarla como transparente.
El cuarto paso es configurar el fondo para DecorView y pegar el xml con esquinas redondeadas debajo
[html] Ver texto sin formato
versión lt;?xml ="1.0" codificación="utf-8"?
lt; forma xmlns: android="/apk/res/android"
android: forma="rectangle"gt;
lt; esquinas
android: radio=" 10.0dip"/gt
lt; sólido
android: color=" #e5e5e6"/gt;
lt; trazo
android: color="#464646"/
android.width="2px"/gt ;
lt;/shapegt;
Durante el proceso de prueba, descubrí un fenómeno muy interesante. Si llamo a setBackground de PhoneWindow y luego llamo a setBackground de DecorView, el efecto se mostrará normalmente. sigue
Pero si estas dos líneas de código se invierten, el efecto de visualización será así
Bueno, todavía hay una forma antigua de resolver este problema: mira el código fuente código.
Ver setBackgroundDrawable de PhoneWindow
[java] Ver copia pura
@Override
public final void setBackgroundDrawable( Drawable drawable) {
if (dibujable != mBackgroundDrawable || mBackgroundResource ! = 0) {
mBackgroundResource = 0
mBackgroundDrawable = dibujable; (mDecor ! = null) {
mDecor.setWindowBackground(dibujable
}
}
}
<); p> Resulta que llamar al método setBackgroundDrawable de PhoneWindow llamará al método setWindowBackground de DecorView[java] ver copia simple
public void setWindowBackground(Drawable drawable) {
if (getBackground() != dibujable) {
setBackgroundDrawable(dibujable
if (dibujable ! = null) {
dibujable. getPadding(mBackgroundPadding );
} else {
mBackgroundPadding.setEmpty();
}
drawableChanged(); >
}
}
Aquí, DecorView determina que si el nuevo Drawable pasado es diferente del Drawable que ya estaba configurado, entonces reemplazará el fondo con el nuevo. uno, por lo que si primero establece un fondo redondeado con borde para DecorView y luego lo asigna a PhoneWindow, el fondo será reemplazado por el nuevo fondo.
Si primero configura un fondo redondeado y con bordes para DecorView y luego se lo da a PhoneWindow, el fondo será reemplazado por el nuevo fondo.