Android:旋转整个布局

我需要能够在飞行中旋转整个布局(点击一个button)。

我能够旋转布局使用,例如。 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

下面的第一个图像是应用程序,因为它开始。 第二个,旋转后。 我想填补黑色的“空间”。 任何帮助,将不胜感激。

下面的图片只显示布局中的一个button。 但是,实际上,布局要复杂得多。 我试图达到的目的是“伪造”景观。

开始时旋转后

编辑:更改图像和添加说明。

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> 

简单和棘手的方式,使button点击屏幕方向..举一个例子..

在这里,我使用sharedPreference(Im根据方向设置一个布尔值)

buttononClick的方法。

 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中,为旋转button设置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" /> 

最后一个,是在创build活动你想设置从应用程序Prefernce ..作为

  prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

保持编码..你可以实现你的目标…让我知道,如果它与你的情况。

如果你想从字面上旋转屏幕,你可以强制屏幕方向 。 否则,没有简单的方法来做你正在做的事情,因为View.setRotation(float)将始终呈现在其“真实”范围内的View然后旋转它! 我build议仔细考虑哪些布局元素应该旋转,然后旋转这些具体的。

唯一真正的“自动”实现方式是创build一个自定义布局,基本上衡量,布局和绘制旋转的孩子…老实说,我只会去那里,如果我真的, 真的需要,它可能比它的价值更麻烦!

我会build议你只旋转button,而不是旋转整个布局

 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> 

尝试将您的布局参数设置为match_parent后旋转:

 layout.setRotation(270.0f) 

接着

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

编辑:获取View parent = layout.getParent(); 并根据需要将父视图的宽度和高度设置为您的布局 – 从宽度到高度,反之亦然。

试试这个代码:
(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(); 
  // 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); 

它可能看起来像build议的答案,但是这显示了如何从DisplayMetrics获取维度,并且计算翻译的偏移量有点不同,因为这是它正确工作的唯一方式。

Android:用于横向模式的备用布局xml

我记得,你应该为水平视图定义一个新的布局。 我认为这个链接可以帮助你