2013-06-14 11 views
7

私は2人の人を対象としたアプリケーションを作成しようとしていますが、どちらもその半分を表示していますので、半分を垂直に反転する必要があります。私はLinearLayoutを使用しており、その内に2つのRelativeLayoutがあり、layout_weight="1"です。RelativeLayoutを180度回転させるにはどうすればよいですか?

私はこのフリップを行う方法がわかりません。明らかにandroid:rotateはバージョン11+(3.0+)でのみ利用可能ですが、少なくとも2.2をサポートしたいと思います。

SOに関する他の関連する質問を読んだ後、私は様々なことを試みましたが、どちらもうまくいかないようでした。私はRelativeLayoutを拡張し、onDraw関数をオーバーライドしようとしましたが、何もしないようです。ここに私のコードです:

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

私は助けてくれてありがとう!ありがとう!

+0

A RelativeLayout、その親クラスのViewGroupとして、デフォルト(http://stackoverflow.com/a/でonDraw呼び出すことはありません。 13056400/1122966)。私は解決策を探しています。 – j0n0

+0

まあ、私はアンドロイドにはかなり新しいです、多分RelativeLayoutを使用してこれらのもののための意味ではない?私はちょうどそれが私の要素を画面上に配置する際に最も柔軟になったと思った。 – argoneus

答えて

9

これを試してみてください:

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

結果は次のとおりです。 はenter image description here

+0

+1これは実際には非常にエレガントな解決策です! – dbm

+0

それは動作します!しかし、子ビューのクリック領域は、回転していない同じ位置に維持されます。どのように私はそれを修正する? –

1

非常に興味深い質問!

Activity -sを部分的に作成して、同じレイアウトxmlのコピーを表示してから、アクティブな「zオーダー」をActivityに切り替えて、移動することができます。

Activity Aは「あなた自身の」アクティビティで、透明な上半分と下半分としてRelativeLayoutを持ちます。また、通常の画面方向(setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)など)もあります。

Activity Bは「相手の活動」となります。透明な上半分と、それと同じくRelativeLayoutのコピーもあります。しかし、それは逆の画面の向きを持っています:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT)。また、これはActivity Bの透明部分RelativeLayoutActivity Aの一部、および透明部分ActivityのAがRelativeLayout一部

B. Activityのに必要と重なってしまう重なってしまうことができ意味します対応する launch mode of the Activity-s to "single top"または他の適切な値を入力します。したがって、 "再開"するとき、すなわち、 "make-a-move-ticket"を相手に渡すときに、 Activityの新しいインスタンスを作成しないでください。

残念ながら...REVERSE_PORTRAIT orientation wasn't added until API level 9(アンドロイド2.3.something)とあなたが明示的にこのアプローチについてのきちんとした部分は一つだけの活動以来、フォーカスを持っている(と、それゆえ、入力を取る)ことができることでしょう8.

APIレベルを要求で時間が経過すると、自動的にユーザー入力のためのステートマシンが取得されます。相手があなたの移動を完了するまで、ボードとやり取りする可能性はありません。

これは、少なくともあなたにいくつかのアイデアを提供します。

乾杯!

+0

ああ、この場合の「優位性」も欠点だ... 2人は交代していない。 >しかし、これは興味深い解決策ですが、私は決して電話で直接1つの部分を反転させることを考えなかった – argoneus

+0

実際には:-)次に私の提案はあまり助けにはなりません... – dbm

関連する問題