3

I have a viewPager with CubeTransformer, which is transforming every fragment. And inside every fragment is Image or Video view (with Exoplayer). And when you are trying to change a framgnet with transformation, exoplayer losses preview (I've got a black screen), even it's not playing. But after you changing condition to normal, preview is coming back

Ohterwise, if you will remove pageTransformer, review is not dissapears. How to keep preview always on screen?

CubeTransformer

class CubeTransformer : ViewPager.PageTransformer {
    override fun transformPage(view: View, position: Float) {
        if (view.visibility != View.VISIBLE) return

        view.apply {
            cameraDistance = (view.width * distanceMultiplier).toFloat()
            pivotX = if (position < 0f) view.width.toFloat() else 0f
            pivotY = view.height * 0.5f
            rotationY = 90f * position

            if (position < -1 || position > 1) {
                alpha = 0f // item not visible
            } else {
                alpha = 1f
            }
        }
    }

    private companion object {
        private const val distanceMultiplier: Int = 20
    }
}

VideoView

class VideoView(context: Context) : ConstraintLayout(context, null) {
    private val player = ExoPlayerFactory.newSimpleInstance(context, DefaultTrackSelector(), DefaultLoadControl())
    private val dataSourceFactory = DefaultDataSourceFactory(context, "android")

    private lateinit var model: Model

    init {
        inflate(context, R.layout.story_item_video, this)
        video_view.player = player
        video_view.keepScreenOn = true
        video_view.setBackgroundColor(Color.TRANSPARENT)
        video_view.setShutterBackgroundColor(Color.TRANSPARENT)
    }

    fun setData(model: Model?) {
        if (model== null) return

        this.model = model

        val mediaSource = HlsMediaSource
                .Factory(dataSourceFactory)
                .setExtractorFactory(DefaultHlsExtractorFactory())
                .createMediaSource(Uri.parse(model.streamLink))

        player.playWhenReady = true
        player.prepare(mediaSource)

        player.addListener(object: Player.EventListener {
            override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters?) {
            }

            override fun onSeekProcessed() {}

            override fun onTracksChanged(trackGroups: TrackGroupArray?, trackSelections: TrackSelectionArray?) {
            }

            override fun onPlayerError(error: ExoPlaybackException?) {
            }

            override fun onLoadingChanged(isLoading: Boolean) {
            }

            override fun onPositionDiscontinuity(reason: Int) {
            }

            override fun onRepeatModeChanged(repeatMode: Int) {
            }

            override fun onShuffleModeEnabledChanged(shuffleModeEnabled: Boolean) {
            }

            override fun onTimelineChanged(timeline: Timeline?, manifest: Any?, reason: Int) {
            }

            override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {

            }
        })
    }
}
Strangelove
  • 761
  • 1
  • 7
  • 29

1 Answers1

2

After a day of searching, I've found an answer to my question. You just need to add app:surface_type="texture_view" to your PlayerView

Strangelove
  • 761
  • 1
  • 7
  • 29