是否可以根据当前方向加载不同的xml布局,而不仅仅是纵向/横向?
我正在编写一个具有前置摄像头功能的应用程序。 当设备旋转180度时,我的CAPTURE按钮现在位于相机旁边。当我尝试单击“捕捉”按钮时,这会导致相机被我的手指挡住。
在我的横向XML中,按钮始终在右侧。我喜欢将它对准主页按钮(远离前置摄像头)。
如果无法通过XML完成,还有其他方法可以实现吗?
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ImageButton
android:id="@+id/image_capture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_margin="24dp"
android:background="@drawable/rounded_button_primary"
android:padding="28dp"
android:src="@drawable/ic_camera_black_48dp"
android:tint="@color/icons" />
</RelativeLayout>
答案 0 :(得分:1)
是的,您可以为横向视图分别设计一个具有相同名称的xml文件,创建一个名称为layout-land的文件夹并将xml放在那里。 android会自动重新加载xml
或
你可以通过覆盖像这样的onConfigurationChanged方法来设置引力
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}`
编辑:
private int getScreenOrientation() {
int rotation = getWindowManager().getDefaultDisplay().getRotation();
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = dm.heightPixels;
int orientation;
// if the device's natural orientation is portrait:
if ((rotation == Surface.ROTATION_0
|| rotation == Surface.ROTATION_180) && height > width ||
(rotation == Surface.ROTATION_90
|| rotation == Surface.ROTATION_270) && width > height) {
switch(rotation) {
case Surface.ROTATION_0:
orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
break;
case Surface.ROTATION_90:
orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
break;
case Surface.ROTATION_180:
orientation =
ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
break;
case Surface.ROTATION_270:
orientation =
ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
break;
default:
Log.e(TAG, "Unknown screen orientation. Defaulting to " +
"portrait.");
orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
break;
}
}
return orientation;
}