web-dev-qa-db-fra.com

Android: faire pivoter la disposition entière

J'ai besoin de pouvoir faire pivoter des dispositions entières à la volée (en cliquant sur un bouton).

Je peux faire pivoter les mises en page en utilisant, par exemple. layout.setRotation(270.0f). Le problème est qu'après la rotation, la disposition height et width ne correspond pas à celle de son parent.

J'ai essayé d'inverser height et width comme ça,

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;

Ce qui ne fait rien du tout.

Je travaille avec sdk 14.

La première image ci-dessous est l'application au démarrage. Le second, après une rotation. Je souhaite remplir "l'espace" noir. Toute aide serait appréciée.

Les images ci-dessous ne montrent qu'un bouton dans la mise en page. Cependant, en réalité, la mise en page est beaucoup plus complexe. Ce que j'essaie de réaliser, c'est de "simuler" une vue du paysage.

When startingAfter rotation

Modifier: Images modifiées et descriptions ajoutées.

30
boulaycote

Je ne sais pas pourquoi cela est utile, mais c'est un joli puzzle. Voici quelque chose qui fonctionne pour moi:

En faisant pivoter le clic, procédez comme suit:

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();

Et la mise en page:

<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>
35
yoah

Essayez ce code:

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;
            }
        }
    });
}

Et 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>
5
Sagar Shah

Un moyen simple et délicat de faire l'orientation de l'écran le long du bouton cliquez sur .. avec un exemple ..

Ici, j'utilise le sharedPreference (Im définissant une valeur booléenne basée sur l'orientation)

Méthode pour le bouton 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, définissez une méthode onClick pour le bouton de rotation

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

Le dernier, est dans la création d'activité que vous souhaitez définir la préférence de l'application .. comme

  prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

Continuez à coder .. Vous pouvez atteindre votre objectif ... Faites-moi savoir, si cela fonctionne avec votre scénario.

3
Joyal

Si vous voulez faire pivoter littéralement l'écran, vous pouvez forcer une orientation d'écran . Sinon, il n'y a pas de moyen facile de faire ce que vous essayez de faire car View.setRotation(float) rendra toujours le View dans ses limites "réelles" et puis faites-le tourner! Ce que je suggère, c'est d'examiner attentivement les éléments de la mise en page à faire pivoter, puis de les faire pivoter spécifiquement.

La seule véritable façon "automatique" d'y parvenir serait de créer une mise en page personnalisée qui mesure, met en page et dessine les enfants en rotation ... Honnêtement, je n'irais là-bas que si vraiment, vraiment nécessaire et c'est probablement plus de problèmes que ça vaut!

2
Takhion
    // 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);

Cela peut ressembler à la réponse suggérée, mais cela montre comment obtenir les dimensions de DisplayMetrics et le calcul du décalage pour la traduction est un peu différent car c'est la seule façon dont cela a fonctionné correctement.

1
rexxar

je vais vous suggérer de faire pivoter uniquement le bouton plutôt que de faire tourner toute la mise en page comme

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);
}
});

rotation.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>
1
Rajan

essayez de définir vos paramètres de disposition sur match_parent après la rotation:

layout.setRotation(270.0f)

puis

RelativeLayout layout = (RelativeLayout) findViewById(R.id.rootLayout);     
layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

EDIT: obtenez la parentView View parent = layout.getParent(); et définissez la largeur et la hauteur de la vue parent selon votre mise en page selon vos besoins - en largeur en hauteur et vice versa.

0
Alex

Essayez ce code:
(RelativeLayoutOuterFrame) c'est le nom de votre mise en page que vous souhaitez faire pivoter.

En fait, nous ne faisons pas pivoter la mise en page, nous modifions simplement la hauteur et la largeur.

    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();
0
Andybhai