Android ViewPager2+Fragment 使用 ExoPlayer 播放视频教程

本教程将指导您如何在 Android 中使用 ViewPager2 和 Fragment 来播放视频,并使用 ExoPlayer 实现流畅的视频播放体验。我们还将使用 ViewModel 来管理视频播放状态。

1. 添加依赖

在您的 build.gradle 文件中添加以下依赖项:

implementation 'androidx.viewpager2:viewpager2:1.0.0'
implementation 'com.google.android.exoplayer:exoplayer:2.14.1'

2. 创建布局文件

创建一个包含 ViewPager2 的布局文件,例如 activity_main.xml

<androidx.viewpager2.widget.ViewPager2
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

3. 创建视频 Fragment

创建一个 VideoFragment 类来显示视频:

class VideoFragment : Fragment() {

    private lateinit var player: SimpleExoPlayer

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_video, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val videoUrl = arguments?.getString("videoUrl") ?: "YOUR_VIDEO_URL"

        val videoView = view.findViewById<SimpleExoPlayerView>(R.id.videoView)
        val dataSourceFactory = DefaultDataSourceFactory(requireContext(), Util.getUserAgent(requireContext(), "app"))
        val mediaSource = ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(videoUrl))

        player = SimpleExoPlayer.Builder(requireContext()).build()
        player.prepare(mediaSource)
        player.playWhenReady = true
        videoView.player = player
    }

    override fun onDestroyView() {
        super.onDestroyView()
        player.release()
    }
}

4. 创建视频 PagerAdapter

创建一个 VideoPagerAdapter 类来管理 ViewPager2 中的视频片段:

class VideoPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) : FragmentStateAdapter(fragmentManager, lifecycle) {

    private val videoUrls = listOf(
        'VIDEO_URL_1',
        'VIDEO_URL_2',
        'VIDEO_URL_3'
    )

    override fun getItemCount(): Int {
        return videoUrls.size
    }

    override fun createFragment(position: Int): Fragment {
        val fragment = VideoFragment()
        fragment.arguments = Bundle().apply {
            putString("videoUrl", videoUrls[position])
        }
        return fragment
    }
}

5. 在 MainActivity 中设置 ViewPager2

MainActivity 中设置 ViewPager2 和 VideoPagerAdapter:

class MainActivity : AppCompatActivity() {

    private lateinit var viewPager: ViewPager2

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewPager = findViewById(R.id.viewPager)
        val videoPagerAdapter = VideoPagerAdapter(supportFragmentManager, lifecycle)
        viewPager.adapter = videoPagerAdapter
    }
}

总结

通过以上步骤,您就可以在 ViewPager2 中使用 Fragment 和 ExoPlayer 来播放视频。请确保将 YOUR_VIDEO_URL 替换为实际的视频 URL,将 VIDEO_URL_1VIDEO_URL_2VIDEO_URL_3 替换为您要显示的视频 URL 列表。

扩展

您还可以使用 ViewModel 来管理视频播放状态,例如当前播放的视频、播放进度等。这将使您能够在不同的 Fragment 或 Activity 之间同步视频播放状态。

class VideoViewModel : ViewModel() {

    private val _currentVideoUrl = MutableLiveData<String>()
    val currentVideoUrl: LiveData<String> = _currentVideoUrl

    fun setCurrentVideoUrl(videoUrl: String) {
        _currentVideoUrl.value = videoUrl
    }
}

在您的 VideoFragment 中,您可以使用 ViewModelProvider 获取 VideoViewModel 并监听 currentVideoUrl 的变化,以便在视频 URL 更改时重新加载视频。

本教程仅为一个基本的示例,您可以根据自己的需求进行扩展和改进。

Android ViewPager2+Fragment 使用 ExoPlayer 播放视频教程

原文地址: https://www.cveoy.top/t/topic/qg3j 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录