android - sola - porque no gira la pantalla de mi celular
Android: rotar todo el diseño (9)
Necesito poder rotar diseños completos sobre la marcha (con el clic de un botón).
Soy capaz de rotar los diseños utilizando, por ejemplo. layout.setRotation(270.0f)
. El problema es que, después de la rotación, la height
y el width
del diseño no coinciden con los de su padre .
He intentado invertir height
y width
como tal,
RelativeLayout layout = (RelativeLayout)findViewById(R.id.rootLayout);
LayoutParams layoutParams = layout.getLayoutParams();
int height = layout.getHeight();
int width = layout.getWidth();
layoutParams.height = width;
layoutParams.width = height;
Lo que no hace nada en absoluto.
Estoy trabajando con sdk 14
.
La primera imagen de abajo es la aplicación, ya que se inicia. El segundo, después de una rotación. Deseo llenar el "espacio" negro. Cualquier ayuda sería apreciada.
Las imágenes a continuación muestran solo un botón en el diseño. Sin embargo, en realidad, el diseño es mucho más complejo. Lo que estoy tratando de lograr es "falsificar" una vista del paisaje.
Edición: Imágenes modificadas y descripciones añadidas.
Le sugeriré que gire solo el botón en lugar de rotar todo el diseño como
btn_rotate.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
rotation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.rotate);
rotation.setFillAfter(true);
btn_rotate.startAnimation(rotation);
}
});
rotar.xml
<set>
<rotate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="0"
android:fromDegrees="270"
android:pivotX="50%"
android:pivotY="50%"
android:startOffset="0"
android:toDegrees="270" />
</set>
No estoy seguro de por qué esto es útil, pero es un buen rompecabezas. Aquí hay algo que me funciona:
En rotar clic, haga esto:
RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.main);
int w = mainLayout.getWidth();
int h = mainLayout.getHeight();
mainLayout.setRotation(270.0f);
mainLayout.setTranslationX((w - h) / 2);
mainLayout.setTranslationY((h - w) / 2);
ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) mainLayout.getLayoutParams();
lp.height = w;
lp.width = h;
mainLayout.requestLayout();
Y el diseño:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:id="@+id/main"
android:layout_height="match_parent"
android:background="#ffcc88"
tools:context=".TestRotateActivity" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Test"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
/>
<Button
android:id="@+id/rotate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Rotate"
android:layout_centerInParent="true"
/>
</RelativeLayout>
Prueba este código:
btnRotate.setOnClickListener(new OnClickListener()
{
@SuppressLint("NewApi")
@Override
public void onClick(View v)
{
int orientation = getResources().getConfiguration().orientation;
switch(orientation)
{
case Configuration.ORIENTATION_LANDSCAPE:
llparent.setRotation(270.0f);
RelativeLayout.LayoutParams layoutParams_LandsScape =
new RelativeLayout.LayoutParams(
rlRoot.getHeight(), rlRoot.getWidth());
layoutParams_LandsScape.setMargins(
rlRoot.getTop(), rlRoot.getRight(),
rlRoot.getBottom(), rlRoot.getLeft());
layoutParams_LandsScape.addRule(RelativeLayout.CENTER_IN_PARENT);
llparent.setLayoutParams(layoutParams_LandsScape);
break;
case Configuration.ORIENTATION_PORTRAIT:
llparent.setRotation(270.0f);
RelativeLayout.LayoutParams layoutParams_Portrait =
new RelativeLayout.LayoutParams(
rlRoot.getHeight(), rlRoot.getWidth());
layoutParams_Portrait.setMargins(
0, 0, rlRoot.getBottom(), rlRoot.getLeft());
layoutParams_Portrait.addRule(RelativeLayout.CENTER_IN_PARENT);
llparent.setLayoutParams(layoutParams_Portrait);
break;
}
}
});
}
Y XML:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".RotateAnim">
<RelativeLayout
android:id="@+id/rlroot"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#090">
<LinearLayout
android:id="@+id/llParent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#900"
android:gravity="center"
android:orientation="vertical">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="Button"/>
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
Prueba este código:
(RelativeLayoutOuterFrame) es el nombre de su diseño. El cual desea rotar.
En realidad, no estamos rotando el diseño. Simplemente cambiamos la altura y el valor del ancho.
int w = RelativeLayoutOuterFrame.getWidth();
int h = RelativeLayoutOuterFrame.getHeight();
ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) RelativeLayoutOuterFrame.getLayoutParams();
lp.height = w;
lp.width = h;
RelativeLayoutOuterFrame.setGravity(RelativeLayout.CENTER_IN_PARENT);
RelativeLayoutOuterFrame.setGravity(RelativeLayout.CENTER_HORIZONTAL);
RelativeLayoutOuterFrame.requestLayout();
Si desea rotar literalmente la pantalla, puede forzar la orientación de la pantalla . De lo contrario, no hay una manera fácil de hacer lo que está tratando de hacer, ya que View.setRotation(float)
siempre renderizará la View
en sus límites "reales" y luego la girará. Lo que sugiero es una cuidadosa consideración de qué elementos del diseño deben rotarse y luego rotarlos específicamente.
La única forma "automática" de lograrlo sería crear un diseño personalizado que esencialmente mida, diseñe y dibuje a los niños rotados ... Honestamente, solo iría allí si realmente lo necesitara y probablemente sea más problemático de lo que vale la pena !
Una forma sencilla y difícil de hacer que la orientación de la pantalla a lo largo del botón haga clic en .. con un ejemplo ...
Aquí, estoy usando sharedPreference (estoy configurando un valor booleano basado en la orientación)
Método para el botón onClick.
public void rotate(View v) {
edt = prefs.edit();
if (!prefs.getBoolean("screen_protrait", true)) {
edt.putBoolean("screen_protrait", true);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
edt.putBoolean("screen_protrait", false);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
edt.commit();
}
En xml, configure un método onClick para rotar el botón
<Button
android:id="@+id/bt_rotate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:onClick="rotate"
android:text="Rotate" />
La última, está en unCrear de actividad en la que desea establecer la preferencia desde la aplicación ... como
prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
Siga codificando ... Puede lograr su objetivo ... Avíseme, si está trabajando con su escenario.
intente establecer sus parámetros de diseño en match_parent después de la rotación:
layout.setRotation(270.0f)
y entonces
RelativeLayout layout = (RelativeLayout) findViewById(R.id.rootLayout);
layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
EDITAR: obtener la View parent = layout.getParent();
parentView View parent = layout.getParent();
y establezca el ancho y el alto de la vista principal a su diseño según lo necesite, de ancho a alto y viceversa.
Android: XML de diseño alternativo para modo horizontal
Como puedo recordar, debe definir un nuevo diseño para la vista horizontal. Creo que este enlace te puede ayudar.
// get root layout from activity''s XML
LinearLayout mParentLayout = (LinearLayout) findViewById(R.id.activity_main);
// get screen size from DisplayMetrics if you need to rotate before the screen is shown
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;
// if you are rotating after the view was shown
// acquire width and height from the layout''s parent''s LayoutParams
// calculate offset to move the view into correct position
int offset = (width - height) / 2;
// rotate the layout
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(height, width);
mParentLayout.setLayoutParams(lp);
// 90° clockwise
mParentLayout.setRotation(90.0f);
mParentLayout.setTranslationX(offset);
mParentLayout.setTranslationY(-offset);
Puede parecer la respuesta sugerida, pero esto muestra cómo obtener las dimensiones de DisplayMetrics y calcular el desplazamiento de la traducción es un poco diferente porque esa es la única forma en que funcionó correctamente.