2011-02-18 3 views
1

J'ai une activité de dessin qui crée une vue 'canvas' personnalisée qui occupe tout l'écran, permettant à l'utilisateur de dessiner dessus. J'ai besoin de verrouiller l'activité sur l'orientation portrait, car l'application de dessin est un remplacement du carnet de croquis, et l'utilisateur aurait besoin de faire pivoter le 'pad' pour dessiner sans que le pad ne tourne dessus. Cela signifie bien sûr que le menu d'options est également verrouillé à cette orientation et selon l'utilisateur, le menu peut sortir du haut, du bas ou des côtés. Je voudrais que le menu d'options soit toujours situé en bas par rapport à l'utilisateur ... quelques options que je considère et apprécieriez toute suggestion ou information:Android: modifier dynamiquement l'emplacement du menu Options

  1. Autoriser les changements d'orientation, de sorte que le menu se déplace comme Si nécessaire, utilisez le SensorManager pour écouter l'orientation et faites pivoter manuellement la vue de la toile vers l'orientation «correcte» (portrait). Ce serait moche, car il pourrait y avoir un retard dans la rotation de la toile, et il introduit des calculs potentiellement complexes, etc en raison de l'échange de X/Y.
  2. Restreignez les changements d'orientation, puis utilisez SensorManager pour écouter l'orientation et faites tourner manuellement le menu Options vers le bas. Aucune idée si c'est possible.
  3. Verrouillez l'orientation et créez une vue personnalisée qui intercepte le bouton de menu et affiche un menu d'options «fausses» que je dois gérer, etc. Je ne veux vraiment pas devoir remplacer la fonctionnalité du système d'exploitation intégré. un cauchemar à maîtriser pour différentes versions d'OS à l'avenir, etc.

Quelqu'un a des idées sur la façon de gérer cela? J'adorerais que # 2 soit possible, mais je ne trouve rien de ce genre.

Merci,

Paul

EDIT:

ont confirmé que # 2 n'est pas possible, donc je suppose que mes options sont # 1, # 3, à moins que quelqu'un d'autre a des idées?

Répondre

0

Ma solution est la suivante:

  • Permettre des changements d'orientation normale dans le Manifest Android pour l'activité.
  • Dans le constructeur de vue "toile de la commande, le feu un champ de suivi, mDisplay, qui obtient les informations d'affichage via:

code:

mDisplay = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
  • En onDraw(), chèque pour voir si la rotation de l'affichage est autre chose que 0, et retournez la toile à la valeur de rotation 0:

Code:

if (mDisplay.getRotation() > 0) { 
    canvas.save(Canvas.HAS_ALPHA_LAYER_SAVE_FLAG); 
    canvas.rotate(-mDisplay.getRotation(), px, py); 
    ... 
    do stuff 
    ... 
    canvas.restore(); 
} 

Pas sûr que ce soit la meilleure solution, mais cela semble fonctionner.

Questions connexes