2013-06-14 2 views
7

J'essaie de faire une application, qui est destinée à deux personnes et les deux en voient une moitié, donc j'ai besoin de retourner une moitié verticalement. J'utilise un LinearLayout avec deux RelativeLayout s à l'intérieur avec layout_weight="1".Comment faire pivoter un RelativeLayout de 180 degrés?

Il est, je ne suis pas sûr de savoir comment faire ce retournement. Apparemment, android:rotate n'est disponible que dans la version 11+ (3.0+), mais je voudrais qu'il en supporte au moins 2.2. Après avoir lu d'autres questions sur SO, j'ai essayé différentes choses, mais aucune ne semble fonctionner. J'ai essayé d'étendre le RelativeLayout et de surcharger la fonction onDraw, mais cela ne semble pas faire quoi que ce soit. Voici mon code:

public class FlippedRelativeLayout extends RelativeLayout 
{ 
    public FlippedRelativeLayout(Context context) 
    { 
     super(context); 
    } 

    public FlippedRelativeLayout(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
    } 

    public FlippedRelativeLayout(Context context, AttributeSet attrs, 
      int defStyle) 
    { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) 
    { 
     canvas.save(); 
     canvas.rotate(180); 
     super.onDraw(canvas); 
     canvas.restore(); 
    } 
} 

Je serai heureux pour toute aide, merci!

+0

A RelativeLayout, comme classe parente ViewGroup, ne remet pas onDraw par défaut (http://stackoverflow.com/a/ 13056400/1122966). Je cherche une solution. – j0n0

+0

Eh bien, je suis assez nouveau pour Android, peut-être utiliser RelativeLayout n'est pas méchant pour ces choses? Je pensais juste qu'il me donnait le plus de flexibilité en plaçant mes éléments sur l'écran – argoneus

Répondre

9

Essayez ceci:

public class MyRelativeLayout extends RelativeLayout {  
    public MyRelativeLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    public MyRelativeLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public MyRelativeLayout(Context context) { 
     super(context); 
     init(); 
    } 

    private void init() { 
     setStaticTransformationsEnabled(true); 
    } 

    @Override 
    protected boolean getChildStaticTransformation(View child, Transformation t) { 
     t.setTransformationType(Transformation.TYPE_MATRIX); 
     Matrix m = t.getMatrix(); 
     m.reset(); 
     m.postRotate(180, child.getWidth()/2.0f, child.getHeight()/2.0f); 
     return true; 
    } 
} 

Le résultat est: enter image description here

+0

+1 C'est en fait une solution très élégante ! – dbm

+0

Cela fonctionne! Mais les zones de clic sur l'affichage enfant restent sur le même emplacement que celles qui n'ont pas été pivotées. Comment je corrige ça? –

1

Question très intéressante!

Vous pourriez peut-être essayer de créer deux Activity -s partiellement transparents, en montrant leur propre copie de la même mise en page xml, puis en changeant le "z-order" du Activity actif en fonction de qui le tourner pour effectuer un mouvement. A serait "votre propre" activité et il aurait une moitié supérieure transparente et la RelativeLayout comme c'est la moitié inférieure. Il aurait également une orientation d'écran normale, comme: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT).

Activity B serait "l'activité de votre adversaire". Il aurait également une moitié supérieure transparente et une copie du même RelativeLayout que c'est la partie inférieure. Il aurait cependant une orientation d'écran inversé, comme: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT). Cela signifierait que la partie transparente de Activity B chevaucherait la RelativeLayout partie de Activity A, et la partie transparente de Activity A chevaucherait la RelativeLayout partie de Activity B.

Vous pouvez également Mettez le launch mode of the Activity-s to "single top" correspondant ou une autre valeur appropriée, de sorte que vous ne créez pas une nouvelle instance de votre Activity lorsque vous le "recommencez", c'est-à-dire en passant le "make-a-move-ticket" à l'adversaire.

Malheureusement, le ...REVERSE_PORTRAIT orientation wasn't added until API level 9 (Android 2.3.something) et vous demandez niveau de l'API explicite 8.

La partie propre de cette approche serait que, puisque seule activité peut avoir le focus (et, par conséquent, prendre d'entrée) à A un moment donné, vous obtiendriez automatiquement un statemachine pour l'entrée de l'utilisateur: l'adversaire n'aurait pas la possibilité d'interagir avec son plateau jusqu'à ce que vous ayez fait votre mouvement et vice versa.

J'espère que cela vous donne au moins quelques idées.

À la votre!

+0

Argh, l'avantage dans ce cas est aussi un inconvénient ... Les deux personnes ne se relaient pas, elles cliquent juste leur partie le cas échéant>. > Mais c'est une solution intéressante, je n'ai jamais pensé à "basculer" une partie directement sur le téléphone – argoneus

+0

Argh en effet :-) Alors ma suggestion n'est pas d'une grande aide ... – dbm

Questions connexes