#android #kotlin #android-6.0-marshmallow #screen-orientation #screen-rotation
#Android #kotlin #android-6.0-marshmallow #ориентация экрана #поворот экрана
Вопрос:
Могу ли я проверить, как я могу повернуть экран с помощью кода в Android?
Устройство (Android 6 ARM CPU), которое я использую, не имеет датчика для обнаружения изменения ориентации, и мне нужно сделать это вручную.
Проблема этого устройства в том, что оно не сохранит настройки, как только я изменю ориентацию экрана через меню настроек.
При следующем включении он вернется к «Ландшафту» по умолчанию.
Я пытался использовать приведенные ниже коды (по одному), чтобы изменить его, он не работает (означает, что экран не меняется).
Settings.System.putInt(contentResolver, Settings.System.USER_ROTATION, 1);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
На этом устройстве есть два варианта (поворот экрана и внешний поворот экрана).
Мне нужно изменить обе ориентации, чтобы достичь того, чего я хочу, с помощью настройки — опции отображения.
Для меня подходят коды Kotlin или Java. Любой совет?
Ответ №1:
Вы не можете вращать ядро Android из своего приложения, но вы можете создать пользовательский макет в своем проекте и управлять им самостоятельно следующим образом :
сначала создайте пользовательский макет :
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;
import android.widget.FrameLayout;
public class URotateLayout extends FrameLayout{
public static final String TAG = "URotateLayout";
public static final int ORIENTATION_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
public static final int ORIENTATION_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
public static final int ORIENTATION_SENSOR_LANDSCAPE = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE;
public static final int ORIENTATION_SENSOR_PORTRAIT = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT;
public static final int ORIENTATION_SENSOR = ActivityInfo.SCREEN_ORIENTATION_SENSOR;
public static final int ORIENTATION_LOCKED = ActivityInfo.SCREEN_ORIENTATION_LOCKED;
private int mOrientation;
private int mLastOrientation;
private int mDefaultVideoContainerWidth;
private int mDefaultVideoContainerHeight;
private int mScreenWidth;
private int mScreenHeight;
public URotateLayout(Context context) {
super(context);
}
public URotateLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public URotateLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void updateScreenWidthAndHeight() {
Display display = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
mScreenWidth = metrics.widthPixels;
mScreenHeight = metrics.heightPixels;
}
public boolean isLandscape() {
updateScreenWidthAndHeight();
return mScreenWidth > mScreenHeight;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
updateScreenWidthAndHeight();
if (isLandscape()) {
mDefaultVideoContainerWidth = mScreenWidth;
mDefaultVideoContainerHeight = mScreenHeight;
} else {
mDefaultVideoContainerWidth = mScreenWidth;
// mDefaultVideoContainerHeight = mScreenWidth * 9 / 16;
mDefaultVideoContainerHeight=mScreenHeight;
}
setMeasuredDimension(mDefaultVideoContainerWidth, mDefaultVideoContainerHeight);
}
public int getOrientation() {
return mOrientation;
}
public void setOrientation(int orientation) {
if (getContext() instanceof Activity) {
Activity mActivity = (Activity) getContext();
switch (orientation) {
case ORIENTATION_PORTRAIT:
mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
case ORIENTATION_LANDSCAPE:
mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
case ORIENTATION_SENSOR_LANDSCAPE:
mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
break;
case ORIENTATION_SENSOR_PORTRAIT:
mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
break;
case ORIENTATION_SENSOR:
mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
break;
case ORIENTATION_LOCKED:
mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
break;
}
mOrientation = orientation;
invalidate();
}
}
public void locked() {
mLastOrientation = mOrientation;
setOrientation(ORIENTATION_LOCKED);
}
public boolean isLocked() {
return mOrientation == ORIENTATION_LOCKED ? true : false;
}
public void unlocked() {
setOrientation(mLastOrientation);
}
public void toggleOrientation() {
if (getContext() instanceof Activity amp;amp; mOrientation != ORIENTATION_LOCKED) {
Activity mActivity = (Activity) getContext();
if (isLandscape()) {
mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
} else {
mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
if (mOrientation == ORIENTATION_SENSOR) {
getHandler().postDelayed(new Runnable() {
@Override
public void run() {
setOrientation(mOrientation);
}
}, 2000);
}
}
}
}
Во-вторых, добавьте это в свой макет, XML-файл, подобный этому :
<yourPackage_name.URotateLayout
android:id="@ id/rotate_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">
<your_layout_here/>
</yourPackage_name.URotateLayout>
наконец, используйте его в своей деятельности или фрагменте, подобном этому :
//define the view i use the **butterknife**
@Bind(R.id.rotate_layout)
URotateLayout rotateLayout;
@Override
public void toggleScreenOrientation() {
if (rotateLayout != null) {
rotateLayout.toggleOrientation();
}
}
//use this for set oriention
public void setScreenOriention(int oriention) {
rotateLayout.setOrientation(oriention);
}
Комментарии:
1. Это может быть полезно для других. Я оставлю все как есть. Причина, по которой я не могу использовать этот метод: пользователь хочет повернуть весь экран (не только мое приложение, весь системный экран). Они не хотят просматривать детали из меню настроек, чтобы изменить его.