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.
Modifier: Images modifiées et descriptions ajoutées.
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>
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>
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.
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!
// 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.
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);
}
});
<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>
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.
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();