Android: rotation de la mise en page complète

j'ai besoin d'être en mesure de tourner des dispositions entières à la volée (sur le claquement d'un bouton).

je suis capable de faire tourner les dispositions en utilisant, par exemple. layout.setRotation(270.0f) . le problème est que, après la rotation, la disposition height et width ne correspond pas au de son parent .

j'ai essayé d'Inverser height et width comme ainsi,

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;

Qui ne fait rien du tout.

je travaille avec sdk 14 .

La première image ci-dessous est l'application qu'il démarre. Le second, après une rotation. Je souhaite remplir le noir "de l'espace". 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 faire, c'est "feindre" une vision du paysage.

When starting After rotation

Edit: images et ajout de descriptions.

27
demandé sur boulaycote 2014-01-26 00:21:41

9 réponses

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

sur le clic de rotation, faire ceci:

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 disposition:

<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>
32
répondu yoah 2014-01-31 09:00:08

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>
4
répondu Sagar Shah 2017-05-29 13:35:34

façon simple et délicate de faire l'orientation de l'écran le long du bouton cliquer.. avec un exemple..

ici, j'utilise la référence partagée (Im définissant une valeur booléenne basée sur l'orientation )

méthode pour 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éfinir 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" />

dernier, est en état d'activité vous voulez définir le Préfernce de L'Application..comme

  prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

gardez le code.. Vous pouvez atteindre votre objectif...Dis-moi si ça marche avec ton scénario.

3
répondu Joyal 2014-01-31 09:34:19

si vous voulez littéralement tourner l'écran, vous pouvez forcer une orientation de l'écran . Sinon il n'y a pas de façon facile de faire ce que vous essayez de faire car View.setRotation(float) rendra toujours le View dans ses "vraies" limites et puis le tourner! Ce que je suggère, c'est d'examiner soigneusement quels éléments de la mise en page devraient être mis en rotation et ensuite de les faire pivoter spécifiquement.

le seul vrai moyen" automatique " de pour y parvenir, il faudrait créer un agencement personnalisé qui, essentiellement, mesure, dessine et fait tourner les enfants... Honnêtement, je n'irais là-bas que si j'en avais vraiment besoin, vraiment et c'est probablement plus de problèmes que ça en vaut la peine!

2
répondu Takhion 2017-05-23 12:02:45

je vous suggère de tourner uniquement le bouton plutôt que de tourner toute la disposition 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
répondu Rajan 2014-01-29 10:34:03
    // 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 des dimensions à partir de DisplayMetrics et le calcul de l'offset pour la traduction est un peu différent parce que c'est la seule façon dont il a fonctionné correctement.

1
répondu rexxar 2017-09-12 12:50:02

essayez de définir vos paramètres de mise en page à match_parent après rotation:

layout.setRotation(270.0f)

et puis

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

EDIT: obtenir le parentView View parent = layout.getParent(); et de définir la largeur et la hauteur de la vue parent à votre disposition que vous avez besoin - en largeur-hauteur et vice versa.

0
répondu Alex 2014-01-29 14:33:14

essayez ce code:

(Relativelayoutoutouterframe) c'est le nom de votre mise en page.qui vous voulez faire pivoter.

en fait, nous ne sommes pas tourner la disposition.on change 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
répondu Andybhai 2015-06-04 12:53:56

Android: mise en page alternative xml pour le mode paysage

comme je m'en souviens, vous devriez définir une nouvelle disposition pour la vue horizontale. Je pense que ce lien peut vous aider

-1
répondu albert2702 2017-05-23 12:02:45