2013-06-14 9 views
7

Ich versuche eine Anwendung zu machen, die für zwei Personen gedacht ist und beide die eine Hälfte sehen, also muss ich die eine Hälfte vertikal drehen. Ich verwende eine LinearLayout mit zwei s darin mit layout_weight="1".Wie wird ein RelativeLayout um 180 Grad gedreht?

Die Sache ist, ich bin mir nicht sicher, wie man diesen Flip macht. Anscheinend ist android:rotate nur in Version 11+ (3.0+) verfügbar, aber ich möchte, dass es mindestens 2.2 unterstützt.

Nachdem ich andere verwandte Fragen zu SO gelesen hatte, probierte ich verschiedene Dinge aus, von denen keine zu funktionieren scheint. Ich habe versucht, das RelativeLayout zu erweitern und die Funktion zu überschreiben, aber es scheint nichts zu tun. Hier ist mein 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(); 
    } 
} 

Ich werde mich für jede Hilfe freuen, danke!

+0

A RelativeLayout, als seine Elternklasse Viewgroup, rufen OnDraw nicht standardmäßig (http://stackoverflow.com/a/ 13056400/1122966). Ich suche nach einer Lösung. – j0n0

+0

Nun, ich bin ziemlich neu in Android, vielleicht mit RelativeLayout ist nicht gemein für diese Dinge? Ich dachte nur, es gab mir die größte Flexibilität bei der Platzierung meiner Elemente auf dem Bildschirm – argoneus

Antwort

9

Versuchen Sie folgendes:

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; 
    } 
} 

Das Ergebnis ist: enter image description here

+0

+1 Dies ist eigentlich eine sehr elegante Lösung ! – dbm

+0

Es funktioniert! Die Klickbereiche in der untergeordneten Ansicht bleiben jedoch an derselben Position wie nicht gedreht. Wie repariere ich das? –

1

Sehr interessante Frage!

Man könnte vielleicht versuchen, zwei teilweise transparant Activity es zu schaffen, ihre eigene Kopie des gleichen Layout xml zeigte und dann auf die „Z-Reihenfolge“ der aktiven Activity Einschalten whos abhängig macht es ist eine Bewegung zu machen.

Activity A wäre "Ihre eigene" Aktivität und es würde eine transparente obere Hälfte und die RelativeLayout als untere Hälfte haben. Es hätte auch eine normale Bildschirmausrichtung wie: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT).

Activity B wäre "Ihre Gegner Aktivität". Es würde auch eine transparente obere Hälfte und eine Kopie desselben RelativeLayout als sein unterer Teil haben. Es hätte jedoch eine umgekehrte Bildschirmausrichtung wie: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT). Dies würde bedeuten, dass die transparenter Teil von Activity B den RelativeLayout Teil von Activity A überlappen würde, und den transparenten Teil von Activity A dem RelativeLayout Teil von Activity B.

Sie könnten auch überlappen würde Setzen Sie den entsprechenden launch mode of the Activity-s to "single top" oder einen anderen geeigneten Wert, so dass Sie keine neue Instanz Ihres Activity erstellen, wenn Sie "erneut starten", dh das "make-a-move-ticket" an den Gegner weitergeben.

Leider ist die ...REVERSE_PORTRAIT orientation wasn't added until API level 9 (Android 2.3.something) und Sie explizit anfordern API-Ebene 8.

Das schmucke Teil über diesen Ansatz wäre, dass da nur eine Aktivität Fokus haben kann (und damit Eingang nehmen) an Zu einem bestimmten Zeitpunkt erhältst du automatisch eine Statusanzeige für die Benutzereingabe: Der Gegner hat erst dann die Möglichkeit, mit seinem Board zu interagieren, wenn du deinen Zug gemacht hast und umgekehrt.

Hoffe, das gibt Ihnen zumindest einige Ideen.

Prost!

+0

Argh, der "Vorteil" in diesem Fall ist auch ein Nachteil ... Die beiden Menschen nicht abwechselnd, sie klicken nur ihren Teil, wenn angemessen>. > Aber das ist eine interessante Lösung, ich habe nie darüber nachgedacht, einen Teil direkt am Telefon zu "spiegeln" – argoneus

+0

Argh in der Tat :-) Dann ist mein Vorschlag keine große Hilfe ... – dbm

Verwandte Themen