如何根据不同的方向(0,90,180,270)设置视图重力?

时间:2016-06-27 09:53:57

标签: android

是否可以根据当前方向加载不同的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>

1 个答案:

答案 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;
}