レイアウト全体をオンザフライで(ボタンをクリックするだけで)回転できるようにする必要があります。
たとえば、を使用してレイアウトを回転させることができます。 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
。
以下の最初の画像は、起動時のアプリです。回転後の2番目。黒い「スペース」を埋めたい。任意の助けをいただければ幸いです。
以下の画像は、レイアウト内のボタンのみを示しています。ただし、実際には、レイアウトははるかに複雑です。私が達成しようとしているのは、ランドスケープビューを「偽造」することです。
編集:画像を変更し、説明を追加しました。
これがなぜ役に立つのかはわかりませんが、ナイスパズルです。ここに私のために働くものがあります:
回転クリックで、これを行います:
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>
ボタンのクリックに沿って画面の向きを変える簡単でトリッキーな方法..例付き..
ここでは、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());
コーディングを続けてください。あなたの目標を達成することができます...それがあなたのシナリオで機能しているなら、教えてください。
文字通り画面を回転させたい場合は、 画面の向きを強制 にできます。そうしないと、View.setRotation(float)
が常にView
をその「実際の」境界にレンダリングし、then回転するため、あなたがやろうとしていることを行う簡単な方法がありません。私が提案するのは、レイアウトのどの要素を回転させ、それらを具体的に回転させるべきかを慎重に考慮することです。
それを達成するための唯一の真の「自動」方法は、回転した子供を基本的に測定、レイアウト、描画するカスタムレイアウトを作成することです。正直なところ、私が本当に行くのは、本当に、本当にそれはおそらく価値があるよりももっと面倒です!
// 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から寸法を取得する方法を表示し、それが適切に機能する唯一の方法であるため、翻訳のオフセットの計算は少し異なります。
レイアウト全体を回転させるのではなく、ボタンのみを回転させることをお勧めします
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);
}
});
<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));
_
編集:parentView 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();