[宣传视频] refactor: 宣传视频播放重构 step1 ;
This commit is contained in:
@@ -1,10 +1,23 @@
|
||||
package com.mogo.och.common.module.wigets.video
|
||||
|
||||
data class AdsDatas(val ads:MutableList<RotationItem>)
|
||||
data class AdsDatas(val ads: MutableList<MediaItem>)
|
||||
|
||||
data class RotationItem(
|
||||
data class MediaItem(
|
||||
var path: String,
|
||||
var type: Int,
|
||||
var cacheImgPath: String,
|
||||
var title: String
|
||||
)
|
||||
) {
|
||||
companion object {
|
||||
const val MEDIA_TYPE_IMAGE = 0
|
||||
const val MEDIA_TYPE_VIDEO = 1
|
||||
}
|
||||
|
||||
fun isImageType(): Boolean {
|
||||
return this.type == MEDIA_TYPE_IMAGE
|
||||
}
|
||||
|
||||
fun isVideoType(): Boolean {
|
||||
return this.type == MEDIA_TYPE_VIDEO
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
package com.mogo.och.common.module.wigets.video
|
||||
|
||||
import AdvancePagerAdapter
|
||||
import AdvanceViewPager
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.widget.RelativeLayout
|
||||
|
||||
class ImageVideoRotationView @JvmOverloads constructor(
|
||||
context: Context, attrs: AttributeSet? = null
|
||||
) : RelativeLayout(context, attrs) {
|
||||
|
||||
private var viewPager: AdvanceViewPager? = null
|
||||
private var pagerAdapter: AdvancePagerAdapter? = null
|
||||
|
||||
companion object {
|
||||
const val TAG = "ImageAndVideoRotation"
|
||||
}
|
||||
|
||||
init {
|
||||
initView()
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
private fun initView() {
|
||||
viewPager = AdvanceViewPager(context)
|
||||
pagerAdapter = AdvancePagerAdapter(context, viewPager!!)
|
||||
viewPager?.adapter = pagerAdapter
|
||||
addView(viewPager, LayoutParams(-1, -1))
|
||||
}
|
||||
|
||||
fun setData(list: MutableList<RotationItem>) {
|
||||
pagerAdapter?.setData(list)
|
||||
}
|
||||
|
||||
fun setPause() {
|
||||
pagerAdapter?.setPause()
|
||||
}
|
||||
|
||||
fun setResume() {
|
||||
pagerAdapter?.setResume()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,288 @@
|
||||
package com.mogo.och.common.module.wigets.video
|
||||
|
||||
import AdvanceImageView
|
||||
import AdvanceVideoView
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.RelativeLayout
|
||||
import androidx.viewpager.widget.PagerAdapter
|
||||
import androidx.viewpager.widget.ViewPager
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
|
||||
import com.mogo.eagle.core.utilcode.util.CountDownTimer
|
||||
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack
|
||||
|
||||
class MediaLoopPlayView @JvmOverloads constructor(
|
||||
context: Context, attrs: AttributeSet? = null
|
||||
) : RelativeLayout(context, attrs) {
|
||||
|
||||
companion object {
|
||||
const val TAG = "MediaLoopPlayView"
|
||||
}
|
||||
|
||||
private var viewPager: AdvanceViewPager? = null
|
||||
private var pagerAdapter: AdvancePagerAdapter? = null
|
||||
|
||||
init {
|
||||
initView()
|
||||
}
|
||||
|
||||
private fun initView() {
|
||||
viewPager = AdvanceViewPager(context)
|
||||
pagerAdapter = AdvancePagerAdapter(context, viewPager!!)
|
||||
viewPager?.adapter = pagerAdapter
|
||||
addView(viewPager, LayoutParams(-1, -1))
|
||||
}
|
||||
|
||||
fun setMediaData(list: MutableList<MediaItem>) {
|
||||
pagerAdapter?.setMediaData(list)
|
||||
}
|
||||
|
||||
fun setPause() {
|
||||
pagerAdapter?.setPause()
|
||||
}
|
||||
|
||||
fun setResume() {
|
||||
pagerAdapter?.setResume()
|
||||
}
|
||||
}
|
||||
|
||||
class AdvanceViewPager : ViewPager {
|
||||
constructor(context: Context) : super(context)
|
||||
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
|
||||
|
||||
override fun onTouchEvent(ev: MotionEvent?): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter(),
|
||||
ViewPager.OnPageChangeListener {
|
||||
|
||||
private val mContext: Context = context
|
||||
private val mViewPager: ViewPager = viewPager
|
||||
|
||||
private var mDataList = mutableListOf<MediaItem>()
|
||||
private var mItemViewList = mutableListOf<View>()
|
||||
|
||||
private var mLastViewPagerPosition = -1
|
||||
private var mImageCountDownTimer: CountDownTimer? = null
|
||||
|
||||
fun setMediaData(list: MutableList<MediaItem>) {
|
||||
if (list.isEmpty()) {
|
||||
CallerLogger.d(MediaLoopPlayView.TAG, "setMediaData, list为空")
|
||||
return
|
||||
}
|
||||
|
||||
mDataList.addAll(list)
|
||||
mItemViewList.clear()
|
||||
list.forEach {
|
||||
addItemView(it)
|
||||
}
|
||||
|
||||
mViewPager.addOnPageChangeListener(this)
|
||||
notifyDataSetChanged()
|
||||
mViewPager.currentItem = 0
|
||||
|
||||
if (mItemViewList.size > 0) {
|
||||
startLoopPlay()
|
||||
}
|
||||
}
|
||||
|
||||
override fun getCount(): Int {
|
||||
return mDataList.size
|
||||
}
|
||||
|
||||
override fun isViewFromObject(view: View, `object`: Any): Boolean {
|
||||
return view === `object`
|
||||
}
|
||||
|
||||
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
|
||||
container.removeView(mItemViewList[position])
|
||||
}
|
||||
|
||||
override fun instantiateItem(container: ViewGroup, position: Int): Any {
|
||||
val view: View = mItemViewList[position]
|
||||
container.addView(view)
|
||||
return view
|
||||
}
|
||||
|
||||
override fun getItemPosition(`object`: Any): Int {
|
||||
return POSITION_NONE
|
||||
}
|
||||
|
||||
private fun addItemView(item: MediaItem) {
|
||||
if (item.isImageType()) {
|
||||
val imageView = AdvanceImageView(mContext)
|
||||
imageView.setImagePath(item.path)
|
||||
mItemViewList.add(imageView)
|
||||
} else if (item.isVideoType()) {
|
||||
val videoView = AdvanceVideoView(mContext)
|
||||
videoView.setVideoPath(item.path, item.cacheImgPath)
|
||||
mItemViewList.add(videoView)
|
||||
} else {
|
||||
CallerLogger.d(MediaLoopPlayView.TAG, "addItemView 不支持的文件类型:${item.type}")
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 开始播放循环
|
||||
* 1.如果是视频,开始播放视频,等到播放完成后根据media类型开始播放下一个
|
||||
* 2.如果是图片,展示图片,同时开始timer倒计时,倒计时完时根据media类型开始播放下一个
|
||||
*/
|
||||
private fun startLoopPlay() {
|
||||
val currentPosition = mViewPager.currentItem
|
||||
val currentMediaItem = mDataList[currentPosition]
|
||||
if (mItemViewList[currentPosition] is AdvanceVideoView) {
|
||||
CallerLogger.d(
|
||||
MediaLoopPlayView.TAG,
|
||||
"startLoopPlay: AdvanceVideoView, url=${currentMediaItem.path}"
|
||||
)
|
||||
val videoView = mItemViewList[currentPosition] as AdvanceVideoView
|
||||
videoView.setCacheImageViewVisible()
|
||||
videoView.setVideo(videoPlayLifecycleCallBack)
|
||||
} else if (mItemViewList[currentPosition] is AdvanceImageView) {
|
||||
CallerLogger.d(
|
||||
MediaLoopPlayView.TAG,
|
||||
"startLoopPlay: AdvanceImageView, url=${currentMediaItem.path}"
|
||||
)
|
||||
startImageCountDownTimer()
|
||||
} else {
|
||||
CallerLogger.d(
|
||||
MediaLoopPlayView.TAG,
|
||||
"startLoopPlay 不支持的文件类型:${currentMediaItem.type}, url=${currentMediaItem.path}"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private var videoPlayLifecycleCallBack = object : GSYSampleCallBack() {
|
||||
|
||||
override fun onPrepared(url: String?, vararg objects: Any?) {
|
||||
CallerLogger.d(MediaLoopPlayView.TAG, "onPrepared")
|
||||
}
|
||||
|
||||
override fun onAutoComplete(url: String?, vararg objects: Any?) {
|
||||
CallerLogger.d(MediaLoopPlayView.TAG, "onAutoComplete")
|
||||
playNextItemView(false)
|
||||
}
|
||||
|
||||
override fun onPlayError(url: String?, vararg objects: Any?) {
|
||||
super.onPlayError(url, *objects)
|
||||
CallerLogger.d(MediaLoopPlayView.TAG, "onPlayError, error=${objects}")
|
||||
playNextItemView(true)
|
||||
}
|
||||
}
|
||||
|
||||
private fun startImageCountDownTimer() {
|
||||
if (mImageCountDownTimer != null) {
|
||||
mImageCountDownTimer?.cancel()
|
||||
mImageCountDownTimer = null
|
||||
}
|
||||
mImageCountDownTimer = object : CountDownTimer(5000L, 1000L) {
|
||||
override fun onTick(millisUntilFinished: Long) {
|
||||
CallerLogger.d(
|
||||
MediaLoopPlayView.TAG,
|
||||
"mImageCountDownTimer倒计时秒, countDown=${millisUntilFinished / 1000}"
|
||||
)
|
||||
}
|
||||
|
||||
override fun onFinish() {
|
||||
CallerLogger.d(MediaLoopPlayView.TAG, "mImageCountDownTimer倒计时秒, onFinish")
|
||||
playNextItemView(false)
|
||||
}
|
||||
}.start()
|
||||
}
|
||||
|
||||
private fun cancelImageCountDownTimer() {
|
||||
if (mImageCountDownTimer != null) {
|
||||
mImageCountDownTimer?.cancel()
|
||||
mImageCountDownTimer = null
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据当前item情况,播放下一个item
|
||||
*/
|
||||
private fun playNextItemView(isOnVideoError: Boolean) {
|
||||
val currentPosition = mViewPager.currentItem
|
||||
val currentMediaItem = mDataList[currentPosition]
|
||||
val currentItemView = mItemViewList[currentPosition]
|
||||
CallerLogger.d(
|
||||
MediaLoopPlayView.TAG,
|
||||
"playNextItemView, currentPosition=$currentPosition, type=${currentMediaItem.type}, url=${currentMediaItem.path}"
|
||||
)
|
||||
if (currentItemView is AdvanceVideoView) {
|
||||
currentItemView.onVideoReset()
|
||||
//videoView.setCacheImageViewVisible()
|
||||
if (isOnVideoError) {
|
||||
currentItemView.clearLocalErrorVideo()
|
||||
}
|
||||
if (mItemViewList.size == 1) {
|
||||
currentItemView.startPlay(currentMediaItem.path)
|
||||
return
|
||||
}
|
||||
}
|
||||
if (currentPosition == mItemViewList.size - 1) {
|
||||
//已经到最后一个, 从头开始
|
||||
mViewPager.post {
|
||||
mViewPager.setCurrentItem(0, true)
|
||||
}
|
||||
} else {
|
||||
mViewPager.post {
|
||||
mViewPager.setCurrentItem(mViewPager.currentItem + 1, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun setPause() {
|
||||
if (mItemViewList.size <= 0) {
|
||||
return
|
||||
}
|
||||
val currentPosition = mViewPager.currentItem
|
||||
if (mItemViewList[currentPosition] is AdvanceVideoView) {
|
||||
val videoView = mItemViewList[mViewPager.currentItem] as AdvanceVideoView
|
||||
videoView.setPause()
|
||||
} else if (mItemViewList[currentPosition] is AdvanceImageView) {
|
||||
cancelImageCountDownTimer()
|
||||
}
|
||||
}
|
||||
|
||||
fun setResume() {
|
||||
if (mItemViewList.size <= 0) {
|
||||
return
|
||||
}
|
||||
val currentPosition = mViewPager.currentItem
|
||||
if (mItemViewList[currentPosition] is AdvanceVideoView) {
|
||||
val videoView = mItemViewList[mViewPager.currentItem] as AdvanceVideoView
|
||||
videoView.setResume()
|
||||
} else if (mItemViewList[currentPosition] is AdvanceImageView) {
|
||||
startImageCountDownTimer()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
|
||||
}
|
||||
|
||||
override fun onPageSelected(position: Int) {
|
||||
}
|
||||
|
||||
override fun onPageScrollStateChanged(state: Int) {
|
||||
if (state == 0) { //静止,什么都没做
|
||||
val currentPosition = mViewPager.currentItem
|
||||
CallerLogger.d(
|
||||
MediaLoopPlayView.TAG,
|
||||
"onPageScrollStateChanged, state = $state, currentItem = $currentPosition, lastPosition = $mLastViewPagerPosition"
|
||||
)
|
||||
if (mItemViewList.size > 1) { //多于1,才会循环跳转
|
||||
startLoopPlay()
|
||||
mLastViewPagerPosition = currentPosition
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@ import com.mogo.commons.mvp.Presenter
|
||||
import com.mogo.eagle.core.data.config.FunctionBuildConfig
|
||||
import com.mogo.eagle.core.utilcode.util.GsonUtils
|
||||
import com.mogo.och.common.module.R
|
||||
import kotlinx.android.synthetic.main.fragment_video_player.*
|
||||
import kotlinx.android.synthetic.main.fragment_video_player.imageVideoRotationView
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
@@ -15,7 +15,11 @@ import kotlinx.android.synthetic.main.fragment_video_player.*
|
||||
class VideoPlayerFragment :
|
||||
MvpFragment<VideoPlayerFragment?, VideoPlayerPresenter?>() {
|
||||
|
||||
private var arrayListOf = mutableListOf<RotationItem>()
|
||||
companion object {
|
||||
private val TAG = VideoPlayerFragment::class.java.simpleName
|
||||
}
|
||||
|
||||
private var arrayListOf = mutableListOf<MediaItem>()
|
||||
|
||||
override fun getLayoutId(): Int {
|
||||
return R.layout.fragment_video_player
|
||||
@@ -25,17 +29,13 @@ class VideoPlayerFragment :
|
||||
return VideoPlayerPresenter(this)
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val TAG = VideoPlayerFragment::class.java.simpleName
|
||||
}
|
||||
|
||||
override fun getTagName(): String {
|
||||
return TAG
|
||||
}
|
||||
|
||||
override fun initViews() {
|
||||
initResourceData()
|
||||
imageVideoRotationView.setData(arrayListOf)
|
||||
imageVideoRotationView.setMediaData(arrayListOf)
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
|
||||
@@ -3,32 +3,24 @@ import android.content.Context
|
||||
import android.media.AudioManager
|
||||
import android.net.Uri
|
||||
import android.util.AttributeSet
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ImageView
|
||||
import android.widget.RelativeLayout
|
||||
import androidx.viewpager.widget.PagerAdapter
|
||||
import androidx.viewpager.widget.ViewPager
|
||||
import com.bumptech.glide.Glide
|
||||
import com.bumptech.glide.request.RequestOptions
|
||||
import com.mogo.eagle.core.utilcode.download.*
|
||||
import com.mogo.eagle.core.utilcode.download.callback.*
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
|
||||
import com.mogo.eagle.core.utilcode.util.CountDownTimer
|
||||
import com.mogo.eagle.core.utilcode.util.FileUtils
|
||||
import com.mogo.eagle.core.utilcode.util.ThreadUtils
|
||||
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
|
||||
import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider
|
||||
import com.mogo.och.common.module.R
|
||||
import com.mogo.och.common.module.wigets.video.ImageVideoRotationView
|
||||
import com.mogo.och.common.module.wigets.video.RotationItem
|
||||
import com.mogo.och.common.module.wigets.video.MediaLoopPlayView
|
||||
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder
|
||||
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack
|
||||
import com.shuyu.gsyvideoplayer.utils.Debuger
|
||||
import com.shuyu.gsyvideoplayer.utils.GSYVideoType
|
||||
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer
|
||||
import me.jessyan.autosize.utils.AutoSizeUtils
|
||||
import java.io.File
|
||||
|
||||
class AdvanceVideoView @JvmOverloads constructor(
|
||||
@@ -94,18 +86,18 @@ class AdvanceVideoView @JvmOverloads constructor(
|
||||
videoViewPlayer?.thumbImageView = cacheImage
|
||||
cacheImage?.setImageResource(R.drawable.video_holder)
|
||||
// setCacheImageViewVisible()
|
||||
Logger.d(ImageVideoRotationView.TAG, "setVideoPath")
|
||||
cacheImage?.let {
|
||||
Glide.with(context).asBitmap().load(cacheImageUrl)
|
||||
.apply(
|
||||
RequestOptions().useUnlimitedSourceGeneratorsPool(true)
|
||||
.placeholder(R.drawable.video_holder)
|
||||
.error(R.drawable.video_holder)
|
||||
.fallback(R.drawable.video_holder)
|
||||
.centerCrop()
|
||||
)
|
||||
.into(it)
|
||||
}
|
||||
Logger.d(MediaLoopPlayView.TAG, "setVideoPath")
|
||||
// cacheImage?.let {
|
||||
// Glide.with(context).asBitmap().load(cacheImageUrl)
|
||||
// .apply(
|
||||
// RequestOptions().useUnlimitedSourceGeneratorsPool(true)
|
||||
// .placeholder(R.drawable.video_holder)
|
||||
// .error(R.drawable.video_holder)
|
||||
// .fallback(R.drawable.video_holder)
|
||||
// .centerCrop()
|
||||
// )
|
||||
// .into(it)
|
||||
// }
|
||||
}
|
||||
|
||||
fun clearLocalErrorVideo() {
|
||||
@@ -131,16 +123,16 @@ class AdvanceVideoView @JvmOverloads constructor(
|
||||
|
||||
fun setVideo(onCompletionListener: GSYSampleCallBack) {
|
||||
loadCacheImg()
|
||||
Logger.d(ImageVideoRotationView.TAG, "setVideo")
|
||||
Logger.d(MediaLoopPlayView.TAG, "setVideo")
|
||||
mOnCompletionListener = onCompletionListener
|
||||
//判断是否已经下载
|
||||
if (downloadVideoName.isNotEmpty()) {
|
||||
Logger.d(
|
||||
ImageVideoRotationView.TAG,
|
||||
MediaLoopPlayView.TAG,
|
||||
"video local url = $mVideoDirPath$downloadVideoName"
|
||||
)
|
||||
if (FileUtils.isFileExists(mVideoDirPath + downloadVideoName)) {
|
||||
Logger.d(ImageVideoRotationView.TAG, "have cache startPlay")
|
||||
Logger.d(MediaLoopPlayView.TAG, "have cache startPlay")
|
||||
startPlay(Uri.fromFile(File(mVideoDirPath + downloadVideoName)).toString())
|
||||
return
|
||||
}
|
||||
@@ -150,15 +142,20 @@ class AdvanceVideoView @JvmOverloads constructor(
|
||||
|
||||
private fun startDownLoadVideo() {
|
||||
//下载视频, 下载成功后再播放
|
||||
Logger.d(ImageVideoRotationView.TAG, "startDownLoadVideo")
|
||||
Logger.d(MediaLoopPlayView.TAG, "startDownLoadVideo")
|
||||
FileUtils.createFileDir(mVideoDirPath)
|
||||
DownloadUtils.downLoad(
|
||||
context, fileNetPath!!, mVideoDirPath!!, downloadVideoName, downListener)
|
||||
val downloadUrl = fileNetPath
|
||||
val downloadDir = mVideoDirPath
|
||||
if (downloadUrl != null && downloadDir != null) {
|
||||
DownloadUtils.downLoad(
|
||||
context, downloadUrl, downloadDir, downloadVideoName, downListener
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun startPlay(localVideoPath: String?) {
|
||||
try {
|
||||
Logger.d(ImageVideoRotationView.TAG, "startPlay")
|
||||
Logger.d(MediaLoopPlayView.TAG, "startPlay")
|
||||
gsyVideoOptionBuilder = GSYVideoOptionBuilder()
|
||||
gsyVideoOptionBuilder
|
||||
?.setUrl(
|
||||
@@ -173,7 +170,7 @@ class AdvanceVideoView @JvmOverloads constructor(
|
||||
videoViewPlayer?.setVideoAllCallBack(mOnCompletionListener)
|
||||
videoViewPlayer?.startPlayLogic()
|
||||
} catch (e: Exception) {
|
||||
Logger.d(ImageVideoRotationView.TAG, "startPlay e = ${e.message}")
|
||||
Logger.d(MediaLoopPlayView.TAG, "startPlay e = ${e.message}")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -198,15 +195,15 @@ class AdvanceVideoView @JvmOverloads constructor(
|
||||
|
||||
override fun onStart(url: String) {
|
||||
setCacheImageViewVisible()
|
||||
Logger.d(ImageVideoRotationView.TAG, "download-onStart")
|
||||
Logger.d(MediaLoopPlayView.TAG, "download-onStart")
|
||||
}
|
||||
|
||||
override fun onProgress(url: String, downloaded: Long, total: Long) {
|
||||
Logger.d(ImageVideoRotationView.TAG, "download-onProgress== ${ (downloaded * 100 / total).toInt() }")
|
||||
Logger.d(MediaLoopPlayView.TAG, "download-onProgress== ${ (downloaded * 100 / total).toInt() }")
|
||||
}
|
||||
|
||||
override fun onFinished(url: String, path: String) {
|
||||
Logger.d(ImageVideoRotationView.TAG, "download-onFinished = $url")
|
||||
Logger.d(MediaLoopPlayView.TAG, "download-onFinished = $url")
|
||||
if (url == fileNetPath) { //发现下载工具在断网又连网后,已完成的任务又都下载,跳转播放出现问题
|
||||
//下载完成
|
||||
ThreadUtils.runOnUiThread {
|
||||
@@ -214,11 +211,11 @@ class AdvanceVideoView @JvmOverloads constructor(
|
||||
}
|
||||
} else {//如果当前文件不存在再次去下载当前的
|
||||
Logger.d(
|
||||
ImageVideoRotationView.TAG, "download-onFinished = not current" +
|
||||
MediaLoopPlayView.TAG, "download-onFinished = not current" +
|
||||
",currentUrl = $fileNetPath "
|
||||
)
|
||||
if (FileUtils.isFileExists(path)) {
|
||||
Logger.d(ImageVideoRotationView.TAG, "have download startPlay")
|
||||
Logger.d(MediaLoopPlayView.TAG, "have download startPlay")
|
||||
ThreadUtils.runOnUiThread {
|
||||
startPlay(Uri.fromFile(File(path)).toString())
|
||||
}
|
||||
@@ -230,220 +227,13 @@ class AdvanceVideoView @JvmOverloads constructor(
|
||||
}
|
||||
|
||||
override fun onError(url: String, error: String?) {
|
||||
Logger.d(ImageVideoRotationView.TAG, "download-onError-$error")
|
||||
Logger.d(MediaLoopPlayView.TAG, "download-onError-$error")
|
||||
//出错再次下载
|
||||
startDownLoadVideo()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class AdvanceViewPager : ViewPager {
|
||||
constructor(context: Context) : super(context)
|
||||
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
|
||||
|
||||
override fun onTouchEvent(ev: MotionEvent?): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter(),
|
||||
ViewPager.OnPageChangeListener {
|
||||
private val mContext: Context = context
|
||||
private val mViewPager: ViewPager = viewPager
|
||||
|
||||
private var dataList = mutableListOf<RotationItem>()
|
||||
private var viewList = mutableListOf<View>()
|
||||
|
||||
private var lastPosition = -1
|
||||
|
||||
private var current = 0
|
||||
private val time = 5000
|
||||
private var pause = false
|
||||
private var countDownTimer: CountDownTimer? = null
|
||||
|
||||
fun setData(list: MutableList<RotationItem>) {
|
||||
if (list.isEmpty()) return
|
||||
dataList.addAll(list)
|
||||
viewList.clear()
|
||||
list.forEach {
|
||||
addView(it)
|
||||
}
|
||||
|
||||
mViewPager.addOnPageChangeListener(this)
|
||||
notifyDataSetChanged()
|
||||
mViewPager.currentItem = 0
|
||||
|
||||
if (viewList.size > 0) {
|
||||
if (viewList[mViewPager.currentItem] is AdvanceVideoView) {//有人反应第一个是视频不播放这边优化了一下
|
||||
Logger.d(ImageVideoRotationView.TAG, "第一个是视频")
|
||||
val video = viewList[mViewPager.currentItem] as AdvanceVideoView
|
||||
video.setVideo(gsySampleCallBack)
|
||||
} else if (viewList[mViewPager.currentItem] is AdvanceImageView) {
|
||||
Logger.d(ImageVideoRotationView.TAG, "startTimer()_1")
|
||||
current = 0//换页重新计算时间
|
||||
startTimer()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getCount(): Int {
|
||||
return dataList.size
|
||||
}
|
||||
|
||||
override fun isViewFromObject(view: View, `object`: Any): Boolean {
|
||||
return view === `object`
|
||||
}
|
||||
|
||||
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
|
||||
container.removeView(viewList[position])
|
||||
}
|
||||
|
||||
override fun instantiateItem(container: ViewGroup, position: Int): Any {
|
||||
val view: View = viewList[position]
|
||||
container.addView(view)
|
||||
return view
|
||||
}
|
||||
|
||||
override fun getItemPosition(`object`: Any): Int {
|
||||
return POSITION_NONE
|
||||
}
|
||||
|
||||
private fun addView(item: RotationItem) {
|
||||
if (item.type == 1) { // 表示视频
|
||||
val videoView = AdvanceVideoView(mContext)
|
||||
videoView.setVideoPath(item.path, item.cacheImgPath)
|
||||
viewList.add(videoView)
|
||||
} else { // 表示图片
|
||||
val imageView = AdvanceImageView(mContext)
|
||||
imageView.setImagePath(item.path)
|
||||
viewList.add(imageView)
|
||||
}
|
||||
}
|
||||
|
||||
fun setPause() {
|
||||
pause = true
|
||||
if (viewList.size > 0 && viewList[mViewPager.currentItem] is AdvanceVideoView) {
|
||||
val videoView = viewList[mViewPager.currentItem] as AdvanceVideoView
|
||||
videoView.setPause()
|
||||
}
|
||||
}
|
||||
|
||||
fun setResume() {
|
||||
pause = false
|
||||
if (viewList.size > 0 && viewList[mViewPager.currentItem] is AdvanceVideoView) {
|
||||
val videoView = viewList[mViewPager.currentItem] as AdvanceVideoView
|
||||
videoView.setResume()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
|
||||
}
|
||||
|
||||
override fun onPageSelected(position: Int) {
|
||||
}
|
||||
|
||||
override fun onPageScrollStateChanged(state: Int) {
|
||||
// 由于viewpager的预加载机制onPageSelected这里面加载videoview 放的跟玩一样 等操作完成后再播放videoview就香了 很丝滑
|
||||
if (state == 0) { //静止,什么都没做
|
||||
val currentItem = mViewPager.currentItem
|
||||
Logger.d(
|
||||
ImageVideoRotationView.TAG,
|
||||
"state = $state currentItem = $currentItem lastPosition = $lastPosition"
|
||||
)
|
||||
if (viewList.size > 1) { //多于1,才会循环跳转
|
||||
if (viewList[mViewPager.currentItem] is AdvanceVideoView) {
|
||||
val videoView = (viewList[mViewPager.currentItem] as AdvanceVideoView)
|
||||
videoView.setCacheImageViewVisible()
|
||||
videoView.setVideo(gsySampleCallBack)
|
||||
} else if (viewList[mViewPager.currentItem] is AdvanceImageView) {
|
||||
Logger.d(ImageVideoRotationView.TAG, "startTimer()")
|
||||
current = 0//换页重新计算时间
|
||||
startTimer()
|
||||
}
|
||||
lastPosition = mViewPager.currentItem
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private var gsySampleCallBack = object : GSYSampleCallBack() {
|
||||
|
||||
override fun onPrepared(url: String?, vararg objects: Any?) {
|
||||
Logger.d(ImageVideoRotationView.TAG, "onPrepared")
|
||||
// if (viewList[mViewPager.currentItem] is AdvanceVideoView) {
|
||||
// val videoView = (viewList[mViewPager.currentItem] as AdvanceVideoView)
|
||||
// UiThreadHandler.postDelayed(Runnable {
|
||||
// videoView.setCacheImageViewGone()
|
||||
// }, 1000)
|
||||
// }
|
||||
}
|
||||
|
||||
override fun onAutoComplete(url: String?, vararg objects: Any?) {
|
||||
Logger.d(ImageVideoRotationView.TAG, "onAutoComplete()")
|
||||
if (viewList[mViewPager.currentItem] is AdvanceVideoView) {
|
||||
val videoView = (viewList[mViewPager.currentItem] as AdvanceVideoView)
|
||||
videoView.onVideoReset()
|
||||
if (viewList.size == 1){
|
||||
videoView.startPlay(url)
|
||||
}else{
|
||||
goNextItemView()
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onPlayError(url: String?, vararg objects: Any?) {
|
||||
super.onPlayError(url, *objects)
|
||||
Logger.d(ImageVideoRotationView.TAG, "onPlayError()-${objects}")
|
||||
if (viewList[mViewPager.currentItem] is AdvanceVideoView) {
|
||||
val videoView = (viewList[mViewPager.currentItem] as AdvanceVideoView)
|
||||
videoView.onVideoReset()
|
||||
// videoView.setCacheImageViewVisible()
|
||||
videoView.clearLocalErrorVideo()
|
||||
goNextItemView()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun startTimer() {
|
||||
if (countDownTimer != null) {
|
||||
countDownTimer?.cancel()
|
||||
countDownTimer = null
|
||||
}
|
||||
countDownTimer = object : CountDownTimer(5000, 1000) {
|
||||
override fun onTick(millisUntilFinished: Long) {
|
||||
CallerLogger.d(
|
||||
SceneConstant.M_BUS_P + "startTimer",
|
||||
"倒计时秒 = ${millisUntilFinished / 1000}"
|
||||
)
|
||||
}
|
||||
|
||||
override fun onFinish() {
|
||||
CallerLogger.d(ImageVideoRotationView.TAG + "startTimer", "5s到,跳转")
|
||||
goNextItemView()
|
||||
}
|
||||
}.start()
|
||||
}
|
||||
|
||||
/**
|
||||
* view 跳转
|
||||
*/
|
||||
private fun goNextItemView() {
|
||||
if (mViewPager.currentItem == viewList.size - 1) {//已经到最后一个
|
||||
mViewPager.post {
|
||||
mViewPager.setCurrentItem(0, true)
|
||||
}
|
||||
} else {
|
||||
mViewPager.post {
|
||||
mViewPager.setCurrentItem(mViewPager.currentItem + 1, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class AdvanceImageView @JvmOverloads constructor(
|
||||
context: Context, attrs: AttributeSet? = null
|
||||
) : RelativeLayout(context, attrs) {
|
||||
@@ -586,4 +376,13 @@ class AdvanceGSYVideoPlayer : StandardGSYVideoPlayer {
|
||||
private fun setNeedMute(isMute: Boolean){
|
||||
gsyVideoManager?.player?.setNeedMute(isMute)
|
||||
}
|
||||
|
||||
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
|
||||
super.onSizeChanged(w, h, oldw, oldh)
|
||||
if (!mIfCurrentIsFullscreen) {
|
||||
val dp2px = AutoSizeUtils.dp2px(context, 16f)
|
||||
this.outlineProvider = TextureVideoViewOutlineProvider(dp2px.toFloat())
|
||||
this.clipToOutline = true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,11 +2,9 @@
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<!-- 图片或视频广告-->
|
||||
<com.mogo.och.common.module.wigets.video.ImageVideoRotationView
|
||||
<com.mogo.och.common.module.wigets.video.MediaLoopPlayView
|
||||
android:id="@+id/imageVideoRotationView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -7,7 +7,7 @@ import com.mogo.eagle.core.utilcode.util.GsonUtils
|
||||
import com.mogo.och.bus.passenger.R
|
||||
import com.mogo.och.bus.passenger.presenter.PM2VideoPresenter
|
||||
import com.mogo.och.common.module.wigets.video.AdsDatas
|
||||
import com.mogo.och.common.module.wigets.video.RotationItem
|
||||
import com.mogo.och.common.module.wigets.video.MediaItem
|
||||
import kotlinx.android.synthetic.m2.p_m2_video_fragment.*
|
||||
|
||||
/**
|
||||
@@ -17,7 +17,7 @@ import kotlinx.android.synthetic.m2.p_m2_video_fragment.*
|
||||
class PM2VideoFragment :
|
||||
MvpFragment<PM2VideoFragment?, PM2VideoPresenter?>() {
|
||||
|
||||
private var arrayListOf = mutableListOf<RotationItem>()
|
||||
private var arrayListOf = mutableListOf<MediaItem>()
|
||||
|
||||
override fun getLayoutId(): Int {
|
||||
return R.layout.p_m2_video_fragment
|
||||
|
||||
@@ -9,7 +9,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
|
||||
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
|
||||
import com.mogo.eagle.core.utilcode.util.CountDownTimer
|
||||
import com.mogo.och.common.module.wigets.video.RotationItem
|
||||
import com.mogo.och.common.module.wigets.video.MediaItem
|
||||
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack
|
||||
|
||||
/**
|
||||
@@ -22,7 +22,7 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter
|
||||
private val mContext: Context = context
|
||||
private val mViewPager: ViewPager = viewPager
|
||||
|
||||
private var dataList = mutableListOf<RotationItem>()
|
||||
private var dataList = mutableListOf<MediaItem>()
|
||||
private var viewList = mutableListOf<View>()
|
||||
|
||||
private var lastPosition = -1
|
||||
@@ -32,7 +32,7 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter
|
||||
private var pause = false
|
||||
private var countDownTimer: CountDownTimer? = null
|
||||
|
||||
fun setData(list: MutableList<RotationItem>) {
|
||||
fun setData(list: MutableList<MediaItem>) {
|
||||
if (list.isEmpty()) return
|
||||
dataList.addAll(list)
|
||||
|
||||
@@ -85,7 +85,7 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter
|
||||
return POSITION_NONE
|
||||
}
|
||||
|
||||
private fun addView(item: RotationItem) {
|
||||
private fun addView(item: MediaItem) {
|
||||
if (item.type == 1) { // 表示视频
|
||||
val videoView = AdvanceVideoView(mContext)
|
||||
videoView.setVideoPath(item.path,item.cacheImgPath)
|
||||
|
||||
@@ -4,8 +4,7 @@ import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.widget.RelativeLayout
|
||||
import androidx.viewpager.widget.ViewPager
|
||||
import com.mogo.och.common.module.wigets.video.RotationItem
|
||||
import com.mogo.och.common.module.wigets.video.MediaItem
|
||||
|
||||
/**
|
||||
* @author: wangmingjun
|
||||
@@ -35,7 +34,7 @@ class ImageAndVideoRotation @JvmOverloads constructor(
|
||||
addView(viewPager, LayoutParams(-1, -1))
|
||||
}
|
||||
|
||||
fun setData(list: MutableList<RotationItem>){
|
||||
fun setData(list: MutableList<MediaItem>){
|
||||
pagerAdapter?.setData(list)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user