Comment faire pivoter les vues sur le changement d'orientation sans créer de mise en page?

Cette question a déjà été posée ici, mais sa réponse est incorrecte. J'aimerais faire pivoter certaines vues sur le changement d'orientation de l'écran, mais je veux garder la mise en page inchangée. Ils doivent être tournés de 90, 180, 270 ou 360 degrés selon l'orientation actuelle ( SCREEN_ORIENTATION_LANDSCAPE , SCREEN_ORIENTATION_PORTRAIT , SCREEN_ORIENTATION_REVERSE_LANDSCAPE , SCREEN_ORIENTATION_REVERSE_PORTRAIT ).

C'est ce que je veux atteindre:

Exemple de mise en page

La réponse dans le lien que j'ai mentionné a déclaré que je devrais créer une nouvelle disposition différente dans la layout-land en layout-land . De toute évidence, ce n'est pas ce que je veux. Je ne veux pas recréer l'activité ou modifier l'orientation de la mise en page. Je souhaite seulement faire pivoter certaines vues et garder les autres vues inchangées sur le changement d'orientation.

Il existe une énorme différence entre la rotation de vues spécifiques et la modification ou la récréation de la mise en page entière (à la fois sur le changement d'orientation).

En utilisant la réponse dans ce lien , je pourrai obtenir l'orientation de l'écran actuelle avec cette méthode:

 public static int getScreenOrientation(Context context) { WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); int rotation = windowManager.getDefaultDisplay().getRotation(); DisplayMetrics dm = new DisplayMetrics(); windowManager.getDefaultDisplay().getMetrics(dm); int width = dm.widthPixels; int height = dm.heightPixels; int orientation; // if the device's natural orientation is portrait: if ((rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) && height > width || (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) && width > height) { switch (rotation) { case Surface.ROTATION_0: orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; case Surface.ROTATION_90: orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; case Surface.ROTATION_180: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; break; case Surface.ROTATION_270: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; break; default: Log.e("ScreenOrientation", "Unknown screen orientation. Defaulting to " + "portrait."); orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; } } // if the device's natural orientation is landscape or if the device // is square: else { switch (rotation) { case Surface.ROTATION_0: orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; case Surface.ROTATION_90: orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; case Surface.ROTATION_180: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; break; case Surface.ROTATION_270: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; break; default: Log.e("ScreenOrientation", "Unknown screen orientation. Defaulting to " + "landscape."); orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; } } return orientation; } 

Sur le changement d'orientation, j'aimerais faire quelque chose de simple comme ceci:

 RotateAnimation rotateAnimation = new RotateAnimation(0, getScreenOrientation(getContext())); rotateAnimation.setDuration(2000); for (int i = 0; i < 63; i++) { Button button = (Button) rootView.findViewById(i); button.startAnimation(rotateAnimation); } 

Une autre façon de reformuler ma question serait: "Y at-il un moyen de détecter le changement d'orientation dans la méthode onConfigurationChanged() sans changer la mise en page?". Le problème est qu'il ne pourra détecter aucun changement d'orientation si je désactive déjà le changement d'orientation de la disposition.

Quelqu'un sait comment cela se fait? Je pourrais avoir complètement passé par de mauvaises étapes, et je pense que je devrais utiliser Accelerometer Sensor ou quelque chose de semblable à celui pour atteindre ce que je veux, alors je vous guide.

2 Solutions collect form web for “Comment faire pivoter les vues sur le changement d'orientation sans créer de mise en page?”

Essayez d'utiliser OrientationEventListener . Vous n'avez pas besoin d'utiliser onConfigurationChanged and android:configChanges="orientation|keyboardHidden|screenSize" .

Vous devez définir android:screenOrientation="portrait" pour l'activité dans AndroidManifest.xml. Voici ma solution avec OrientationEventListener :

 public class MyActivity extends Activity{ private ImageButton menuButton; private Animation toLandAnim, toPortAnim; private OrientationListener orientationListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_image_ruler); menuButton=(ImageButton)findViewById(R.id.menu_button); toLandAnim= AnimationUtils.loadAnimation(this, R.anim.menubutton_to_landscape); toPortAnim= AnimationUtils.loadAnimation(this, R.anim.menubutton_to_portrait); orientationListener = new OrientationListener(this); } @Override protected void onStart() { orientationListener.enable(); super.onStart(); } @Override protected void onStop() { orientationListener.disable(); super.onStop(); } private class OrientationListener extends OrientationEventListener{ final int ROTATION_O = 1; final int ROTATION_90 = 2; final int ROTATION_180 = 3; final int ROTATION_270 = 4; private int rotation = 0; public OrientationListener(Context context) { super(context); } @Override public void onOrientationChanged(int orientation) { if( (orientation < 35 || orientation > 325) && rotation!= ROTATION_O){ // PORTRAIT rotation = ROTATION_O; menuButton.startAnimation(toPortAnim); } else if( orientation > 145 && orientation < 215 && rotation!=ROTATION_180){ // REVERSE PORTRAIT rotation = ROTATION_180; menuButton.startAnimation(toPortAnim); } else if(orientation > 55 && orientation < 125 && rotation!=ROTATION_270){ // REVERSE LANDSCAPE rotation = ROTATION_270; menuButton.startAnimation(toLandAnim); } else if(orientation > 235 && orientation < 305 && rotation!=ROTATION_90){ //LANDSCAPE rotation = ROTATION_90; menuButton.startAnimation(toLandAnim); } } } } 

Cela empêche également les rotations trop fréquentes lorsque l' orientation est d'environ 45, 135 … etc. Espérons que cela vous aide.

Les bases sont en fait beaucoup plus faciles. Jetez un oeil à Manipulation des changements d'exécution .

Tout d'abord, en définissant

 android:configChanges="orientation|keyboardHidden|screenSize" 

Dans votre Manifeste sur votre balise d'activité, vous pouvez gérer le changement d'orientation vous-même. (L' orientation devrait être suffisante, mais il y a parfois des problèmes où l'événement ne se déclenche pas seul).

Vous sautez ensuite onCreate et, à la place, onConfigurationChanged est appelé. Remplacez cette méthode et appliquez vos modifications de mise en page ici. Que vous modifiez votre orientation linearLayouts ici ou que vous ayez une disposition personnalisée de la gestion des vues pour les différents écrans, cela dépend de votre implémentation.

L'animation sera un peu plus délicate, si ce n'est même possible. Une recherche rapide indique que ce n'est pas le cas .


Mise à jour pour le commentaire "Je ne souhaite que faire pivoter certaines vues elles-mêmes plutôt que de faire tourner la mise en page"

En théorie, il est possible de créer votre propre mise en page et de gérer le dessin des vues de votre enfant. Je l'ai simplement essayé, mais je n'ai pas pu produire de résultats au moment opportun, mais ce que vous devriez faire:

  • Gardez vos dernières valeurs mesurées utiliser des étiquettes sur la vue ou des approches similaires pour garder les dernières mesures et mises en page, de sorte que, après le changement d'orientation, vous pouvez diff
  • Attendez le changement d'orientation : déclenchez le dessin tourné – faites pivoter le canevas, mettez les vues avec les dimensions précédentes et dessinez les vues des enfants où elles auraient été antérieures , et
  • Démarrer une animation interpoler de la dernière à la nouvelle valeur, en tournant le canevas de la dernière à la nouvelle mise en page

C'est ainsi que je le ferais.

coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.