我正在使用exoplayer在我的Android应用中播放来自网址的视频。在肖像中,一切都按预期工作(使用viewpager,片段和活动内部的选项卡)。 我的目标是在用户处于横向状态时全屏播放视频。这意味着只有视频才能在风景中播放,所有其他细节都会消失,并在人像时返回到原始布局。 我怎么能实现这个目标呢?或者实现这一目标的最佳方法是什么?任何示例代码都将不胜感激。
答案 0 :(得分:7)
我是一个菜鸟所以这是我能帮到的最好的,顺便说一句,我在Exoplayer演示应用程序中测试了这个,我将exoplayer高度更改为600px并且我应用了这个代码并且它工作得很好。
添加此代码以检测屏幕方向
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checking the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
//First Hide other objects (listview or recyclerview), better hide them using Gone.
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) simpleExoPlayerView.getLayoutParams();
params.width=params.MATCH_PARENT;
params.height=params.MATCH_PARENT;
simpleExoPlayerView.setLayoutParams(params);
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
//unhide your objects here.
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) simpleExoPlayerView.getLayoutParams();
params.width=params.MATCH_PARENT;
params.height=600;
simpleExoPlayerView.setLayoutParams(params);
}
}
btw,以防你没有使用FrameLayout而是使用RelativeLayout
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) simpleExoPlayerView.getLayoutParams();
我忘了你需要隐藏动作或标题栏,希望这段代码有帮助,在上面的代码中添加这些代码,我认为你需要将你的活动扩展到AppCompatActivity以使getSupportActionBar代码起作用。
if(getSupportActionBar()!=null) {
getSupportActionBar().hide();
}
//To show the action bar
if(getSupportActionBar()!=null) {
getSupportActionBar().show();
}
这也可能有助于整个项目全屏设置,隐藏状态bar.etc,必须根据屏幕方向添加到onConfigurationChanged内。
在LandScape中
ExoPlayerActivity.this.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN || View.SYSTEM_UI_FLAG_IMMERSIVE);
在PORTRAIT中从全屏退出
ExoPlayerActivity.this.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
我编辑了代码,添加了View.SYSTEM_UI_FLAG_IMMERSIVE,以防止用户点击视频中的控制按钮时显示状态栏。
答案 1 :(得分:1)
您可以在设置播放器时检查方向并相应地设置参数:
if (getActivity().getResources().getConfiguration().orientation ==
Configuration.ORIENTATION_LANDSCAPE) {
params = (LinearLayout.LayoutParams)
exoPlayerView.getLayoutParams();
params.width = params.MATCH_PARENT;
params.height = params.MATCH_PARENT;
exoPlayerView.setLayoutParams(params);
}
隐藏操作栏:
((AppCompatActivity) getActivity()).getSupportActionBar().hide();
答案 2 :(得分:1)
我对数据绑定的解释:
<强> layout.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="android.view.View" />
<variable
name="orientationLandscape"
type="boolean" />
<variable
name="step"
type="com.udacity.zeban.baking.data.models.Step" />
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.exoplayer2.ui.SimpleExoPlayerView
android:id="@+id/step_video"
android:layout_width="match_parent"
android:layout_height="@dimen/player_height"
app:layout_constraintBottom_toTopOf="@+id/scroll"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_height="@{orientationLandscape}" />
<ScrollView
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/step_video">
<android.support.v7.widget.CardView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/spacing_small"
android:visibility="@{orientationLandscape ? View.GONE : View.VISIBLE}">
<TextView
android:id="@+id/step_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/spacing_small"
android:text="@{step.getDescription()}"
tools:text="@tools:sample/lorem/random" />
</android.support.v7.widget.CardView>
</ScrollView>
</android.support.constraint.ConstraintLayout>
并将其添加到您的actvity或片段中:
@BindingAdapter("layout_height")
public static void setLayoutHeight(View view, boolean orientationLandscape) {
view.getLayoutParams().height = orientationLandscape ? RelativeLayout.LayoutParams.MATCH_PARENT : 600;
}
@Override
public void onResume() {
super.onResume();
binding.setOrientationLandscape(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE);
}
我的项目here
答案 3 :(得分:0)
对于带有硬件按钮的屏幕,如果没有其他视图与ExoPlayer的PlayerView共享屏幕,则默认情况下它将填充整个屏幕。但是,对于在屏幕上具有虚拟按钮的设备,它将无法覆盖整个屏幕。就我而言,将行添加到PlayerView可以解决问题。
ads:resize_mode="fill"
由于我在活动布局中有admob广告,因此我已在顶部RelativeLayout标签中添加了这一行。
xmlns:ads="http://schemas.android.com/apk/res-auto"
我知道这没有任何意义,但是使用android:resize_mode="fill"
会给您造成gradle构建错误。
您还可以删除系统用户界面以获取更多空间:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
hideSystemUI();
}
}
private void hideSystemUI() {
// Enables "lean back" mode
// Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
// Hide the nav bar and status bar
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN);
}
有关更多信息,请访问android开发人员页面https://developer.android.com/training/system-ui/immersive
答案 4 :(得分:0)
在横向模式下,请确保将播放器视图的长度和宽度与其父视图相匹配。
使用此按钮隐藏状态栏:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
使用此按钮隐藏导航栏:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
答案 5 :(得分:0)
我认为我们在这里没有找到更明显的答案。只需在layout-land
目录中创建一个新的布局文件,以便在横向模式下将应用新的布局文件。
在这个新的布局文件中,只需将ExoPlayer
的{{1}}更改为layout_height
,以使其占据整个屏幕。
答案 6 :(得分:0)
设置屏幕方向的最简单方法。
取一个布尔值:
boolean abc = false;
现在:
if (abc) {
list.set(position, new IconsModel(R.drawable.screenlocked, "Portrait"));
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
abc = false;
} else {
list.set(position, new IconsModel(R.drawable.screenrotate, "Landscape"));
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
abc = true;
}
我正在使用 recyclerview
这就是我使用 list.add
的原因。
你可以改用这行代码:
imageView.setImageDrawable(getResources().getDrawable(R.drawable.yourIamge));
答案 7 :(得分:-1)
您可以为横向模式创建一个对话框,首先初始化一个对话框,
private void initFullscreenDialog() {
mFullScreenDialog = new Dialog(mContext, android.R.style.Theme_Black_NoTitleBar_Fullscreen) {
public void onBackPressed() {
if (mExoPlayerFullscreen) { //mExoPlayerFullscreen is a boolean to check if it is already fullscreen or not
closeFullscreenDialog();
}
super.onBackPressed();
}
};
}
现在,如下所示,您将初始化全屏按钮:-
mFullScreenButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mExoPlayerFullscreen) {
((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
openFullscreenDialog();
} else {
((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
closeFullscreenDialog();
}
}
});
然后您可以按以下步骤打开和关闭全屏:-
private void openFullscreenDialog() {
((ViewGroup) playerView.getParent()).removeView(playerView);
mFullScreenDialog.addContentView(playerView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
mFullScreenIcon.setImageResource(R.drawable.ic_exit_fullscreen);
mExoPlayerFullscreen = true;
mFullScreenDialog.show();
}
private void closeFullscreenDialog() {
((ViewGroup) playerView.getParent()).removeView(playerView);
((FrameLayout) findViewById(R.id.main_media_frame)).addView(playerView);
mExoPlayerFullscreen = false;
mFullScreenDialog.dismiss();
mFullScreenIcon.setImageResource(R.drawable.ic_fullscreen);
}
答案 8 :(得分:-4)
我添加到了playerView:
app:resize_mode="fixed_width"
然后一切正常