以下是一个使用ExoPlayer和SurfaceView播放视频,并在全屏时隐藏其他UI的Kotlin代码示例:

  1. 首先,确保你的项目中已经添加了ExoPlayer库的依赖。

  2. 创建一个布局文件,命名为activity_main.xml,并添加一个SurfaceView和其他UI元素,如下所示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <SurfaceView
        android:id="@+id/surfaceView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- 添加其他UI元素 -->

</RelativeLayout>
  1. 在MainActivity.kt中,使用ExoPlayer和SurfaceView来播放视频,并在全屏时隐藏其他UI元素。以下是完整的代码:
import android.content.pm.ActivityInfo
import android.content.res.Configuration
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.appcompat.app.AppCompatActivity
import com.google.android.exoplayer2.DefaultLoadControl
import com.google.android.exoplayer2.DefaultRenderersFactory
import com.google.android.exoplayer2.ExoPlayerFactory
import com.google.android.exoplayer2.SimpleExoPlayer
import com.google.android.exoplayer2.source.ExtractorMediaSource
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout
import com.google.android.exoplayer2.ui.PlayerView
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
import com.google.android.exoplayer2.util.Util

class MainActivity : AppCompatActivity() {

    private lateinit var player: SimpleExoPlayer
    private lateinit var playerView: PlayerView
    private lateinit var surfaceView: SurfaceView
    private lateinit var originalLayoutParams: ViewGroup.LayoutParams

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

        playerView = PlayerView(this)
        playerView.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FILL
        surfaceView = findViewById(R.id.surfaceView)
        originalLayoutParams = surfaceView.layoutParams

        initializePlayer()
        preparePlayer()

        surfaceView.setOnClickListener {
            toggleFullScreen()
        }
    }

    private fun initializePlayer() {
        val renderersFactory = DefaultRenderersFactory(this)
        val trackSelector = DefaultTrackSelector()
        val loadControl = DefaultLoadControl()

        player = ExoPlayerFactory.newSimpleInstance(
            this,
            renderersFactory,
            trackSelector,
            loadControl
        )

        playerView.player = player
    }

    private fun preparePlayer() {
        val userAgent = Util.getUserAgent(this, "ExoPlayerDemo")
        val mediaSource = ExtractorMediaSource.Factory(
            DefaultDataSourceFactory(this, userAgent)
        ).createMediaSource(Uri.parse("your_video_url_here"))

        player.prepare(mediaSource)
        player.playWhenReady = true
    }

    private fun toggleFullScreen() {
        if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
            hideSystemUi()
            setLayoutToFullScreen()
        } else {
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
            showSystemUi()
            restoreOriginalLayout()
        }
    }

    private fun hideSystemUi() {
        window.decorView.systemUiVisibility = (
                View.SYSTEM_UI_FLAG_FULLSCREEN
                        or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                )
    }

    private fun showSystemUi() {
        window.decorView.systemUiVisibility = (
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                )
    }

    private fun setLayoutToFullScreen() {
        val params = surfaceView.layoutParams as FrameLayout.LayoutParams
        params.width = ViewGroup.LayoutParams.MATCH_PARENT
        params.height = ViewGroup.LayoutParams.MATCH_PARENT
        surfaceView.layoutParams = params
    }

    private fun restoreOriginalLayout() {
        surfaceView.layoutParams = originalLayoutParams
    }

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

请记得将"your_video_url_here"替换为你自己的视频URL。

这段代码创建了一个SimpleExoPlayer对象,使用ExtractorMediaSource从URL中加载视频源,并将其显示在SurfaceView上。当用户点击SurfaceView时,会切换到全屏模式,隐藏其他UI元素,并将SurfaceView的布局参数设置为全屏。当用户退出全屏模式时,会恢复原始的布局参数并显示其他UI元素。

希望这能帮助到你

Android kotlin使用ExoPlayer+SurfaceView 播放视频 全屏时SurfaceView全屏播放 其它ui消失 详细代码

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

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