Подтвердить что ты не робот

Android: поворот всего макета

Мне нужно иметь возможность поворачивать все макеты на лету (одним нажатием кнопки).

Я могу повернуть макеты, используя, например. layout.setRotation(270.0f). Проблема заключается в том, что после поворота макет height и width не соответствуют родительскому объекту.

Я попытался инвертировать height и width так,

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.

Первое изображение ниже - это приложение при его запуске. Второй, после вращения. Я хочу заполнить черное "пространство". Любая помощь будет оценена.

Изображения ниже показывают только кнопку в макете. Однако на самом деле макет намного сложнее. То, что я пытаюсь достичь, - "фальсифицировать" пейзаж.

When startingAfter rotation

Изменить: Изменены изображения и добавлены описания.

4b9b3361

Ответ 1

Не знаю, почему это полезно, но это хорошая головоломка. Вот что-то, что работает для меня:

При вращении нажмите, сделайте следующее:

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>

Ответ 2

Попробуйте этот код:

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>

Ответ 3

Простой и хитрый способ сделать ориентацию экрана вдоль кнопки нажмите.. с примером..

Здесь я использую sharedPreference (Im, устанавливающий логическое значение на основе ориентации)

Метод для кнопки 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" />

Последний, находится в onCreate of Activity, который вы хотите установить Prefernce из приложения..as

  prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

Сохраняйте кодирование. Вы можете достичь своей цели... Дайте мне знать, если он работает со своим сценарием.

Ответ 4

Если вы хотите буквально повернуть экран, вы можете принудительно настроить ориентацию экрана. В противном случае нет простого способа сделать то, что вы пытаетесь сделать, поскольку View.setRotation(float) всегда будет отображать View в своих "реальных" границах, а затем вращать его! То, что я предлагаю, - это тщательное рассмотрение того, какие элементы макета должны быть повернуты, а затем для их вращения.

Единственным истинным "автоматическим" способом его достижения было бы создание пользовательского макета, который по существу измеряет, макеты и рисует детей, которые вращаются... Честно говоря, я бы пошел туда, если бы действительно, действительно необходимо, и это, вероятно, больше проблем, чем это стоит!

Ответ 5

Я предлагаю вам поворачивать только кнопку, а не вращать весь макет, например

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>

Ответ 6

попробуйте установить параметры макета в match_parent после вращения:

layout.setRotation(270.0f)

а затем

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

EDIT: получите parentView View parent = layout.getParent(); и установите ширину и высоту родительского представления в соответствии с вашим расположением по ширине и высоте. И наоборот.

Ответ 7

Попробуйте этот код:
(RelativeLayoutOuterFrame) это имя вашего макета. Которое вы хотите повернуть.

Собственно, мы не поворачиваем layout.we просто изменяем высоту значение ширины.

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

Ответ 8

    // get root layout from activity 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 parent 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, а вычисление смещения для перевода немного отличается, потому что это единственный способ, которым он работал должным образом.