studio sola samsung rotar rotación porque pantalla manejando grados giratoria girar gira como celular android android-layout rotation

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.



// 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.