Как сделать VideoView полноэкранным

Я хочу воспроизвести видео в своем Activity с помощью VideoView и сделать его полноэкранным и в режиме landscape (со скрытой виртуальной кнопкой и строкой состояния), когда я нажимаю Button.

Но он не может скрыть виртуальную кнопку и имеет белую полосу внизу. моё приложение

Это мой код активности:

public class VideoActivity extends Activity {
private VideoView mVideoView;
private String mUrl;
private Button mFullScreen;
private static String TAG = VideoActivity.class.getName();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG,"onCreate");
    setContentView(R.layout.video);
    mVideoView = (VideoView) findViewById(R.id.video);
    mFullScreen = (Button) findViewById(R.id.fullscreen);
    File file = new File(Environment.getExternalStorageDirectory(),"video.mp4");
    mVideoView.setVideoPath(file.getPath());
    mVideoView.start();
    mFullScreen.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            enterFullScreen();
            mFullScreen.setVisibility(View.GONE);
        }
    });

}

@Override
protected void onDestroy() {
    super.onDestroy();
    Log.d(TAG,"onDestroy");
}

private void enterFullScreen(){
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//设置横屏
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//常亮
    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
      RelativeLayout.LayoutParams.MATCH_PARENT,
      RelativeLayout.LayoutParams.MATCH_PARENT
    );
    layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
    layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
    layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
    layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
  }
}

video.xml

 <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <VideoView
        android:id="@+id/video"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="0dp"/>
    <Button
        android:id="@+id/fullscreen"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="visible"
        android:text="Fullscreen"/>
</RelativeLayout>

person PPTing    schedule 21.01.2016    source источник


Ответы (4)


Попробуйте это в ландшафтном режиме.

<VideoView android:id="@+id/video"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
   android:layout_alignParentRight="true"
   android:layout_alignParentBottom="true"
   android:layout_alignParentTop="true"
    />

Скрыть виртуальные кнопки добавьте этот код:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

Исходный размер

         DisplayMetrics metrics = new DisplayMetrics();  getWindowManager().getDefaultDisplay().getMetrics(metrics);
         android.widget.LinearLayout.LayoutParams params = (android.widget.LinearLayout.LayoutParams) videoView.getLayoutParams();
         params.width =  (int) (300*metrics.density);
         params.height = (int) (250*metrics.density);
         params.leftMargin = 30;
         videoView.setLayoutParams(params);

полный размер экрана

         DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics);
         android.widget.LinearLayout.LayoutParams params = (android.widget.LinearLayout.LayoutParams) videoView.getLayoutParams();
         params.width =  metrics.widthPixels;
         params.height = metrics.heightPixels;
         params.leftMargin = 0;
         videoView.setLayoutParams(params);
person Kristo    schedule 21.01.2016
comment
Не могли бы вы еще раз попробовать код xml, я внес некоторые изменения. - person Kristo; 21.01.2016
comment
он может скрыть белую линию, но не может скрыть эти три виртуальные кнопки @Kristo1990 - person PPTing; 21.01.2016
comment
и таким образом, он всегда будет полноэкранным, но он не хочет, чтобы он был полноэкранным, после того, как я нажму кнопку полноэкранного режима, он изменится на полноэкранный - person PPTing; 21.01.2016
comment
проверьте, я добавил код, который вам нужно добавить для виртуальных кнопок - person Kristo; 21.01.2016
comment
да, код, который вы добавляете для вирусной кнопки, работает, и я знаю, как это сделать сейчас, я могу сделать отступ VideoView равным 0,0,0,0 после того, как я нажму кнопку, например mVideoView.setPadding(0,0,0 ,0) В общем, большое спасибо за помощь - person PPTing; 21.01.2016
comment
Это хорошо. Если это помогло вам, пожалуйста, примите мой ответ. Удачного кодирования :) - person Kristo; 21.01.2016
comment
Теперь я обнаружил ошибку: когда я нажимаю другую кнопку, она делает отступы обычными с белой линией внизу, я думаю, мне следует найти другой способ решить эту проблему. - person PPTing; 21.01.2016
comment
и таким образом, видно, что я не могу выйти из полноэкранного режима, но я хочу выйти из полноэкранного режима - person PPTing; 21.01.2016
comment
Я почти уверен, что XML, который я вам дал, работает для полноэкранного просмотра видео. Я не могу помочь вам, если вы собираетесь сделать это по-другому. - person Kristo; 21.01.2016
comment
если вы хотите выйти из полноэкранного режима, вам нужна еще одна кнопка.! - person Kristo; 21.01.2016
comment
да, я знаю, что xml работает для полноэкранного просмотра видео, но он сделает его полноэкранным, прежде чем я нажму полноэкранную кнопку, поэтому я хочу установить отступы (0,0,0,0) в прослушивателе кнопок, он может работать в первый раз но когда мой палец нажимает на экран, как обычно, появляется белая линия. Другой способ, я хочу знать, как выйти из полноэкранного режима. Какой код мне написать? - person PPTing; 21.01.2016
comment
это ваш код xml, он сделает его полноэкранным, прежде чем я нажму кнопку! - person PPTing; 21.01.2016
comment
Хорошо, используйте свой xml и попробуйте сделать это программно. Я отредактирую свой ответ. - person Kristo; 21.01.2016
comment
но используйте его программно, он снова покажет белую линию - person PPTing; 21.01.2016
comment
да, я пытаюсь, но это не полноэкранный режим, это изображение, которое вы можете увидеть [](ww2 .sinaimg.cn/large/7bdcf253gw1f07asslo8gj21ke0y6wtq.jpg) - person PPTing; 21.01.2016
comment
попробуй это requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); - person Kristo; 21.01.2016
comment
Я пробовал это вообще, вы можете видеть это в моем коде, загруженном до T ^ T - person PPTing; 21.01.2016
comment
Ну не знаю, как я могу помочь вам больше. я использовал эти фрагменты раньше, и они работали для меня. возможно, вам нужно что-то изменить в вашем xml, чтобы удалить эту белую строку. Удачи. - person Kristo; 21.01.2016

Наконец, я решаю это с помощью Kristo1990 и prashantwosti. Мой код:

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.MATCH_PARENT,
                RelativeLayout.LayoutParams.MATCH_PARENT
        );
private void enterFullScreen(){
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//设置横屏
        mVideoView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        mVideoView.setLayoutParams(layoutParams);
    }

private void exitFullScreen(){
          this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            mVideoView.setSystemUiVisibility(0);
            isFullScreen = false;
            mFullScreen.setVisibility(View.INVISIBLE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_TOP);
                layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_LEFT);
                layoutParams.removeRule(RelativeLayout.ALIGN_PARENT_RIGHT);
            }else {
                layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,0);
                layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,0);
                layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT,0);
                layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,0);
            }
            mFullScreen.setVisibility(View.VISIBLE);

            mVideoView.setLayoutParams(layoutParams);
        }

И, наконец, я переопределяю KEYCODE_BACK для выхода из полноэкранного режима. Надеюсь, это поможет вам всем, и еще раз спасибо.

person PPTing    schedule 22.01.2016

Вы можете использовать это для BackButton:

closeButton = (Button) findViewById(R.id.buttonClose);
    closeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            Log.d("VideoPreview", "onClick Close Button");
            VideoFullscreenActivity.super.onBackPressed();
        }
    });

Взгляните: Как закрыть VideoView Activity (в настоящее время приходится дважды нажимать назад)

person ʍѳђઽ૯ท    schedule 21.01.2016
comment
таким образом, чтобы завершить действие, но я не хочу заканчивать действие, я пишу код для выхода из полноэкранного режима, такой код, как getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT); - person PPTing; 21.01.2016

Вот несколько фрагментов из моего рабочего приложения:

в активности игрока:

decorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

ваш player_layout.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/video_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black"
android:keepScreenOn="true"
android:orientation="vertical">

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000"
    tools:context=".PlayerActivity">

   <VideoView
     android:id="@+id/videoView"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_gravity="center"/>

</FrameLayout>


</RelativeLayout>

значения/styles.xml:

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>
person prashantwosti    schedule 21.01.2016
comment
Большое спасибо, ваш код помог мне найти новый способ решить эту проблему. - person PPTing; 22.01.2016