我的应用程序中有以下导航结构:
MainActivity -> VideoListFragment -> VideoShowingFragment
(only activity, (shows a list of Video (gets the URL of the video to
container for items via a Recycler- show and plays the video via
all the other View, the URL of the ExoPlayer. From here, the user
fragments) Video is passed to can enter PiP mode)
next Fragment)
因此,当应用启动时,将向用户显示Video
项的列表。当用户单击某个项目时,URL 将传递到VideoShowingFragment
,通过ExoPlayer
库的PlayerView
向用户显示Video
内容。 在顶部PlayerView
,有一个图标,以便用户可以在单击它时进入 PiP 模式。
输入画中画有效,一切都很好,但我的问题是进入画中画模式后如何显示视频列表? 我的意思是:当用户处于VideoShowingFragment
阶段并决定通过进入画中画模式来最小化Video
内容时,我如何向他显示Video
(VideoListFragment
)的列表,以便他可以在浏览列表的同时仍然在画中观看内容?
现在的情况如下:用户进入画中画模式,但用户看到其设备的开始屏幕,而视频内容在右下角最小化。
以下是我项目的一些相关部分:
<!-- AndroidManifest.xml -->
<application
...>
<activity
android:name=".MainActivity"
android:supportsPictureInPicture="true"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
如前所述,VideoListFragment
导航到单击ShowingVideoFragment
:
videoListFragmentViewModel.openVideoEvent.observe(viewLifecycleOwner, EventObserver{ videoUri -> findNavController().navigate(VideoListFragmentDirections.actionVideoListFragmentToVideoShowingFragment(videoUri))})
然后,ShowingFragment
获取显示视频所需的数据。我不会深入探讨,因为它只是典型的ExoPlayer
的东西。
同样在ShowingFragment
,我们有进入画中画模式的逻辑:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = FragmentVideoShowingBinding.inflate(inflater, container, false)
// listener on icon with ID 'pipMode'
binding.pipMode.setOnClickListener{ enablePipMode() }
return binding.root
}
private fun enablePipMode() {
// set aspect ratio
picInPicParamsBuilder.setAspectRatio(Rational(binding.playerView.width, binding.playerView.height))
// enter the PiP mode
activity?.enterPictureInPictureMode(picInPicParamsBuilder.build())
}
// override to make the icon on top of PlayerView eiter visible or invisible
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode)
if(isInPictureInPictureMode){
binding.pipMode.visibility = View.GONE
}
else{
binding.pipMode.visibility = View.VISIBLE
}
}
当我想让用户在浏览VideoListFragment
时以画中画模式观看所选视频时,我是否需要在第二个活动中托管VideoShowingFragment
?或者有没有另一种方法可以实现我想要的?
画中画模式将您的洞活动变成一个小窗口......我相信您需要将视频活动分开。如果您希望在它们之间进行通信(例如在不重置活动的情况下更改视频),请使用本地广播:)
在这种情况下,我认为在清单活动声明中android:launchMode="singleTask"
很重要,因此每当您启动视频活动时,当已经有一个实例处于 PiP 模式时,它将从 pip 模式出来而不会更改。但是,如果您在视频活动中重写 onNewIntent 方法,则实际上可以更改视频:)
如果您不声明singleTask
,则最终可能会得到两个相同的活动。