web-dev-qa-db-ja.com

Android:レイアウト全体を回転させる

レイアウト全体をオンザフライで(ボタンをクリックするだけで)回転できるようにする必要があります。

たとえば、を使用してレイアウトを回転させることができます。 layout.setRotation(270.0f)問題は、回転後、レイアウトheightwidthがその親のものと一致しないことです

私はheightwidthを逆にしてみましたが、

RelativeLayout layout = (RelativeLayout)findViewById(R.id.rootLayout);
LayoutParams layoutParams = layout.getLayoutParams();
int height = layout.getHeight();
int width = layout.getWidth();
layoutParams.height = width;
layoutParams.width = height;

まったく何もしません。

私はsdk 14

以下の最初の画像は、起動時のアプリです。回転後の2番目。黒い「スペース」を埋めたい。任意の助けをいただければ幸いです。

以下の画像は、レイアウト内のボタンのみを示しています。ただし、実際には、レイアウトははるかに複雑です。私が達成しようとしているのは、ランドスケープビューを「偽造」することです。

When startingAfter rotation

編集:画像を変更し、説明を追加しました。

30
boulaycote

これがなぜ役に立つのかはわかりませんが、ナイスパズルです。ここに私のために働くものがあります:

回転クリックで、これを行います:

RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.main);
int w = mainLayout.getWidth();
int h = mainLayout.getHeight();

mainLayout.setRotation(270.0f);
mainLayout.setTranslationX((w - h) / 2);
mainLayout.setTranslationY((h - w) / 2);

ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) mainLayout.getLayoutParams();
lp.height = w;
lp.width = h;
mainLayout.requestLayout();

そしてレイアウト:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:id="@+id/main"
    Android:layout_height="match_parent"
    Android:background="#ffcc88"
    tools:context=".TestRotateActivity" >

    <Button 
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Test"
        Android:layout_alignParentTop="true"
        Android:layout_alignParentLeft="true"
        />

    <Button 
        Android:id="@+id/rotate"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Rotate"
        Android:layout_centerInParent="true"
        />

</RelativeLayout>
35
yoah

このコードを試してください:

btnRotate.setOnClickListener(new OnClickListener()
{
    @SuppressLint("NewApi")
    @Override
    public void onClick(View v) 
    {
        int orientation = getResources().getConfiguration().orientation;
        switch(orientation)
        {
            case Configuration.ORIENTATION_LANDSCAPE:
                llparent.setRotation(270.0f);
                RelativeLayout.LayoutParams layoutParams_LandsScape =
                    new RelativeLayout.LayoutParams(
                        rlRoot.getHeight(), rlRoot.getWidth()); 
                layoutParams_LandsScape.setMargins(
                    rlRoot.getTop(), rlRoot.getRight(),
                    rlRoot.getBottom(), rlRoot.getLeft());
                layoutParams_LandsScape.addRule(RelativeLayout.CENTER_IN_PARENT);
                llparent.setLayoutParams(layoutParams_LandsScape);  
                break;
            case Configuration.ORIENTATION_PORTRAIT:
                llparent.setRotation(270.0f);
                RelativeLayout.LayoutParams layoutParams_Portrait =
                    new RelativeLayout.LayoutParams(
                        rlRoot.getHeight(), rlRoot.getWidth()); 
                layoutParams_Portrait.setMargins(
                    0, 0, rlRoot.getBottom(), rlRoot.getLeft());    
                layoutParams_Portrait.addRule(RelativeLayout.CENTER_IN_PARENT);
                llparent.setLayoutParams(layoutParams_Portrait);
                break;
            }
        }
    });
}

そしてXML:

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context=".RotateAnim">

    <RelativeLayout
        Android:id="@+id/rlroot"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:background="#090">

        <LinearLayout
            Android:id="@+id/llParent"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:background="#900"
            Android:gravity="center"
            Android:orientation="vertical">

            <Button
                Android:id="@+id/button1"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_gravity="center"
                Android:gravity="center"
                Android:text="Button"/>
        </LinearLayout>
    </RelativeLayout>
</RelativeLayout>
5
Sagar Shah

ボタンのクリックに沿って画面の向きを変える簡単でトリッキーな方法..例付き..

ここでは、sharedPreferenceを使用しています(方向に基づいてブール値を設定しています)

ボタンonClickのメソッド。

public void rotate(View v) {
    edt = prefs.edit();

    if (!prefs.getBoolean("screen_protrait", true)) {
        edt.putBoolean("screen_protrait", true);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    } else {
        edt.putBoolean("screen_protrait", false);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
    edt.commit();
}

XMLで、回転ボタンのonClickメソッドを設定します

       <Button
   Android:id="@+id/bt_rotate"
   Android:layout_width="wrap_content"
   Android:layout_height="wrap_content"
   Android:layout_centerInParent="true"
   Android:onClick="rotate"
   Android:text="Rotate" />

最後の1つは、Application..asからPrefernceを設定するonCreate of Activityです。

  prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

コーディングを続けてください。あなたの目標を達成することができます...それがあなたのシナリオで機能しているなら、教えてください。

3
Joyal

文字通り画面を回転させたい場合は、 画面の向きを強制 にできます。そうしないと、View.setRotation(float)が常にViewをその「実際の」境界にレンダリングし、then回転するため、あなたがやろうとしていることを行う簡単な方法がありません。私が提案するのは、レイアウトのどの要素を回転させ、それらを具体的に回転させるべきかを慎重に考慮することです。

それを達成するための唯一の真の「自動」方法は、回転した子供を基本的に測定、レイアウト、描画するカスタムレイアウトを作成することです。正直なところ、私が本当に行くのは、本当に、本当にそれはおそらく価値があるよりももっと面倒です!

2
Takhion
    // get root layout from activity's XML
    LinearLayout mParentLayout = (LinearLayout) findViewById(R.id.activity_main);

    // get screen size from DisplayMetrics if you need to rotate before the screen is shown
    DisplayMetrics displayMetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

    int height = displayMetrics.heightPixels;
    int width = displayMetrics.widthPixels;

    // if you are rotating after the view was shown
    // acquire width and height from the layout's parent's LayoutParams

    // calculate offset to move the view into correct position
    int offset = (width - height) / 2;

    // rotate the layout
    FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(height, width);
    mParentLayout.setLayoutParams(lp);
    // 90° clockwise
    mParentLayout.setRotation(90.0f);
    mParentLayout.setTranslationX(offset);
    mParentLayout.setTranslationY(-offset);

提案された答えのように見えるかもしれませんが、これはDisplayMetricsから寸法を取得する方法を表示し、それが適切に機能する唯一の方法であるため、翻訳のオフセットの計算は少し異なります。

1
rexxar

レイアウト全体を回転させるのではなく、ボタンのみを回転させることをお勧めします

btn_rotate.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) 
{
    rotation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.rotate);
    rotation.setFillAfter(true);
    btn_rotate.startAnimation(rotation);
}
});

rotate.xml

<set>
    <rotate
          xmlns:Android="http://schemas.Android.com/apk/res/Android"
          Android:duration="0"
          Android:fromDegrees="270"
          Android:pivotX="50%"
          Android:pivotY="50%"
          Android:startOffset="0"
          Android:toDegrees="270" />
</set>
1
Rajan

回転後にレイアウトパラメーターをmatch_parentに設定してみてください。

_layout.setRotation(270.0f)
_

その後

_RelativeLayout layout = (RelativeLayout) findViewById(R.id.rootLayout);     
layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
_

編集:parentView View parent = layout.getParent();を取得し、必要に応じて親ビューの幅と高さをレイアウトに設定します(幅と高さ、またはその逆)。

0
Alex

このコードを試してください:
(RelativeLayoutOuterFrame)これは、回転させるレイアウトの名前です。

実際には、レイアウトを回転させるのではなく、高さと幅の値を変更するだけです。

    int w = RelativeLayoutOuterFrame.getWidth();
    int h = RelativeLayoutOuterFrame.getHeight();
    ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) RelativeLayoutOuterFrame.getLayoutParams();
    lp.height = w;
    lp.width = h;
    RelativeLayoutOuterFrame.setGravity(RelativeLayout.CENTER_IN_PARENT);
    RelativeLayoutOuterFrame.setGravity(RelativeLayout.CENTER_HORIZONTAL);
    RelativeLayoutOuterFrame.requestLayout();
0
Andybhai