设为首页 加入收藏

TOP

Recyclerview、Viewpager 实现视频自动播放方案(二)
2023-07-23 13:31:15 】 浏览:132
Tags:Recyclerview Viewpager 方案
nit)? = null fun init() { lastFindPosition = -1 initRecycleView() startAttach(1500) } private fun initRecycleView() { target?.registerOnPageChangeCallback(onPagerChangeListener) } private fun inflateRootVideoPlayer(): View { val rootView = LayoutInflater.from(context) .inflate(R.layout.video_widget_group_album_player, null, false) val video = rootView.findViewById<VideoPlayerView>(R.id.video_player_view) val tvTime = rootView.findViewById<TextView>(R.id.tv_time) val ivAudio = rootView.findViewById<View>(R.id.iv_audio) ivAudio.setOnThrottledClickListener { isSoundOff = !isSoundOff //静音播放 if (isSoundOff) { video.setSoundOff() } else { video.setSoundOpen() } } if (isSoundOff) { video.setSoundOff() } inflateVerticalVideoPlayer(video, tvTime) return rootView } private fun inflateVerticalVideoPlayer( video: VideoPlayerView, tvTime: TextView ) { videoPlayerView = video video.setCoverViewScaleType(ImageView.ScaleType.FIT_CENTER) .setScreenRatio(PLVideoTextureView.ASPECT_RATIO_FIT_PARENT) .setOnVideoCompletionListener { removeVideoParent(rootView) } video.setOnCurrentProgressChange(object : VideoPlayerView.OnCurrentProgressChange { override fun onCurrentProgressChange( currentProgress: Int, currentTime: String? ) { val totalVideoDurationTimeMill = (video.currentPosition) * 1000L//得到秒 val countDownTime = (totalVideoDurationTimeMill - totalVideoDurationTimeMill * (currentProgress / 100f)).toInt() val countDownTimeStr = TimeUtils.getVideoFormatTime(countDownTime / 1000) if (tvTime.text.toString() == countDownTimeStr) return if (currentProgress in 1..99) { tvTime.text = countDownTimeStr } } override fun onCurrentPlayPosition( currentPosition: Int, totalDuration: Int ) { } }) video.tag = VIDEO_PLAYER_TAG } /** * 1、计算当前显示的条目是否包含视频类型 * 2、判断当前的条目是否和为上一个播放的条目,是的话返回 */ private fun findViewAndHandleVideoPlayer() { isLastItemStillVisible() if (currentPosition == -1) return doAfterFindPosition(currentPosition) } private fun doAfterFindPosition(lastCompletelyItemPosition: Int) { if (getVideoItemWithPosition(lastCompletelyItemPosition) == null) return rootView?.let { if (lastCompletelyItemPosition == lastFindPosition && rootView?.visibility == View.VISIBLE) { // 同一个视频条目,且未滑出过界面 if (videoPlayerView?.isPlaying == false) { addVideoPlayerView(lastCompletelyItemPosition) } return } // 滑出过界面的同一个条目,也要重新加载视频 removeVideoParent(rootView) addVideoPlayerView(lastCompletelyItemPosition) lastFindPosition = lastCompletelyItemPosition } } private fun isLastItemStillVisible() { val needRemove = isCurrentItemNeedRemove() if (needRemove) { // 上一条已经不在可视范围内 removeVideoParent(rootView) } } private fun isCurrentItemNeedRemove(): Boolean { if (lastFindPosition != currentPosition) { return true } return false } private fun addVideoPlayerView(eddVisibleItem: Int) { val nextItemView = getItemViewWithPosition(eddVisibleItem) ?: return val videoData = getVideoItemWithPosition(eddVisibleItem) ?: return rootView?.let { root -> if (nextItemView.indexOfChild(root) == -1) { root.invisible() val params = root.layoutParams params?.let { if (params.width != nextItemView.width || params.height != nextItemView.height) { params.width = nextI
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇华为运动健康服务Health Kit 6.9... 下一篇视频实时自然美颜, 无惧素颜上镜

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目