Android - 进入 "画中画 "模式后显示上一个片段。

问题描述 投票:0回答:1

我的应用程序中有以下导航结构。

 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 其中显示了 Video 的内容给用户,通过 PlayerViewExoPlayer 图书馆。在上面的 PlayerView有一个图标,当用户点击它时,可以进入PiP模式。

进入PiP工作,一切都很好,但我的问题是,我如何能显示视频列表后,进入PiP模式? 我的意思是。当用户进入PiP模式后 VideoShowingFragment 阶段,并决定尽量减少 Video 进入PiP模式的内容,我怎样才能让他看到列表中的内容?Videos (VideoListFragment),这样他就可以在PiP模式下一边浏览列表,一边观看内容了?

现在的情况是这样的: 用户进入PiP模式,但用户看到的是设备的开始屏幕,而视频内容在右下角被最小化。

下面是我项目的一些相关部分。

<!-- 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))})

The ShowingFragment 然后获取显示视频所需的数据。我不会深究,因为这只是典型的 ExoPlayer 的东西。

也在 ShowingFragment我们有进入PiP模式的逻辑。

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
        }
}

我是否需要主机 VideoShowingFragment 在第2个活动中,当我想让用户在浏览PiP模式下观看选定的视频时,我想让用户以PiP模式观看视频。VideoListFragment ? 还是有其他的方法来实现我想要的?

android android-fragments android-activity android-picture-in-picture
1个回答
0
投票

PiP模式将你的孔活动变成一个小窗口... 我相信,你需要将视频活动分开。如果你想在它们之间进行通信,请使用本地广播(比如改变视频而不重新设置活动):)

在这种情况下,我认为重要的是,你要让 android:launchMode="singleTask" 在你的manifest活动声明中,所以每当你启动视频活动时,当已经有一个实例处于PiP模式时,它将从pip模式中出来,而不会发生变化。但是如果你在视频活动中重写了onNewIntent方法,你实际上可以改变你的视频:)

如果你不在视频活动中声明 singleTask,你可能最终会有两个相同的活动。

© www.soinside.com 2019 - 2024. All rights reserved.