ПРОСТОЙ ответ и до 2018 года.
Положительные оценки за этот ответ: Код ниже
1) Неважно, если вы установите FULL_SCREENили нет.Поскольку это соответствует родителю, это всегда будет работать.В старом принятом ответе, если вы не установили FULL_SCREEN, android возьмет на себя весь размер телефона, и тогда VideoView будет вне экрана;
2) Вам не нужно создавать Custom VideoView или PlayerView.;
3) Он не вызывает метод несколько раз.В старом принятом ответе он вызывает метод измерения несколько раз излишне;
4) Также имеется кнопка для изменения ориентации, например, приложение YouTube;
5) Установка автоматического поворота телефона в положение OFF также блокирует изменение ориентации приложения.
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
...
setPlayerViewLayoutParams();
...
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
setPlayerViewLayoutParamsForLandScape();
} else {
setPlayerViewLayoutParamsForPortrait();
}
}
private void setPlayerViewLayoutParamsForLandScape() {
ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_PARENT);
mPlayerView.setLayoutParams(lp);
}
private void setPlayerViewLayoutParamsForPortrait() {
Display display = myContext.getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
Double doubleHeight = width / 1.5;
Integer height = doubleHeight.intValue();
ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.MATCH_PARENT, height);
mPlayerView.setLayoutParams(lp);
}
private void setPlayerViewLayoutParams() {
if (myContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
setPlayerViewLayoutParamsForLandScape();
} else {
setPlayerViewLayoutParamsForPortrait();
}
}
OBS: я использую PlayerView внутри ConstraintLayout.Потому что я работаю с ExoPlayer Media Library .
frag_player.xml
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBlack"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintVertical_bias="0.0"/>
</android.support.constraint.ConstraintLayout>
ДОПОЛНИТЕЛЬНО
Я также хочу, чтобы кнопка изменила ориентацию
Чтобы полностью воспроизвести приложение youtube, вам, вероятно, понадобится кнопка, чтобы настроить плеер на альбомную или книжную ориентацию, это полезно, если пользовательпри автоматическом отключении телефона .
Сначала вам нужно будет выполнить следующие шаги:
- Создать кнопку, которая изменит ориентацию;
- Когда пользователь нажимает кнопку, проверьте текущую ориентацию;
- Установите противоположную ориентацию, например, если она является текущей в LandScape, установите Портрет.
PlayerFragment.java
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.image_button_full_screen:
if (myContext.getResources().getConfiguration().orientation
== Configuration.ORIENTATION_LANDSCAPE) {
myContext.setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
} else {
myContext.setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
break;
}
}
ПРОБЛЕМА 1: вращение устройства больше не работает
Вы заметите, что если нажать кнопку, чтобыизменить ориентацию, вращение устройства больше не будет работать, чтобы изменитьразмер игрока.Это происходит потому, что вы устанавливаете ориентацию на LandScape или Portrait программно, и она будет оставаться такой же навсегда, поэтому вам нужен способ установить ориентацию на SENSOR, поэтому при повороте устройства он будет проверять, какова реальная текущая ориентация.Приведенный ниже метод сделает это за вас.
ПРОБЛЕМА 2: Автоповорот телефона выключен, и он все еще меняет ориентацию
Внутри метода ниже вам необходимо проверить, еслиАвтоповорот телефона включен или выключен, если он включен, вы можете установить ОРИЕНТАЦИЮ на ДАТЧИК, чтобы телефон мог менять ориентацию, когда пользователь поворачивает устройство.В случае, если автоповорот выключен, вы ничего не делаете, поэтому ориентация будет портретной или портретной, в зависимости от того, нажал ли пользователь кнопку полноэкранного режима или нет.
private void setOrientationListener() {
OrientationEventListener orientationEventListener = new OrientationEventListener(this) {
@Override
public void onOrientationChanged(int orientation) {
// 94 > 90 - 10 and 94 < 90 + 10 // 80 < orientation < 100. Rotating to the LEFT.
// 278 > 270 - 10 and 278 < 270 + 10 // 260 < orientation < 280. Rotating to the RIGHT.
int epsilon = 10;
int leftLandscape = 90;
int rightLandscape = 270;
if (epsilonCheck(orientation, leftLandscape, epsilon) ||
epsilonCheck(orientation, rightLandscape, epsilon)) {
if (android.provider.Settings.System.getInt(getContentResolver(),
Settings.System.ACCELEROMETER_ROTATION, 0) == 1) {
// Phone's auto rotation is ON
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
}
}
private boolean epsilonCheck(int a, int b, int epsilon) {
return a > b - epsilon && a < b + epsilon;
}
};
orientationEventListener.enable();
}
Если вы работаете с мультимедийным приложением, у меня есть образец , который научит вас, как эффективно использовать библиотеку Exoplayer.