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 .

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

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

При запускеПосле вращения

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

Solutions Collecting From Web of "Android: поворот всего макета"

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

При повороте нажмите:

 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> 

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

 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> 

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

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

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

 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> 

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

Здесь я использую 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 из приложения.

  prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

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

Попробуйте установить параметры макета в 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(); И установите ширину и высоту родительского представления в соответствии с вашим расположением по ширине и высоте.

Попробуйте этот код:
(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(); 

Android: альтернативный макет xml для ландшафтного режима

Как я помню, вы должны определить новый макет для горизонтального представления. Я думаю, эта ссылка может помочь вам