[M2] 1、图/视频轮播优化

This commit is contained in:
wangmingjun
2023-02-10 19:37:34 +08:00
parent bc0f8e8ec4
commit 77c49061a9
4 changed files with 105 additions and 65 deletions

View File

@@ -34,17 +34,17 @@ class PM2VideoFragment :
override fun initViews() {
initResourceData()
image_video_rotation_view.setData(arrayListOf)
imageVideoRotationView.setData(arrayListOf)
}
override fun onPause() {
super.onPause()
image_video_rotation_view.setPause()
imageVideoRotationView.setPause()
}
override fun onResume() {
super.onResume()
image_video_rotation_view.setResume()
imageVideoRotationView.setResume()
}
private fun initResourceData() {
@@ -52,7 +52,7 @@ class PM2VideoFragment :
arrayListOf.add(
RotationItem(
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1656558672856/小宝宝.mp4",
0,
1,
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1656559345882/1.png",
"小宝宝"
)

View File

@@ -5,28 +5,29 @@ import android.view.View
import android.view.ViewGroup
import androidx.viewpager.widget.PagerAdapter
import androidx.viewpager.widget.ViewPager
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
/**
* @author: wangmingjun
* @date: 2023/2/6
*/
class AdvancePagerAdapter(context: Context, viewPager: ViewPager): PagerAdapter(),
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 dataList = mutableListOf<RotationItem>()
private var viewList = mutableListOf<View>()
private var lastPosition = -1
private var current = 0
private val time = 5000
private val pause = false
private var pause = false
private var thread: Thread? = null
fun setData(list: MutableList<RotationItem>){
fun setData(list: MutableList<RotationItem>) {
if (list.isEmpty()) return
dataList.addAll(list)
@@ -42,12 +43,19 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager): PagerAdapter(
mViewPager.currentItem = 0
if (list.size > 0) {
if (list[0].type == 1) {//有人反应第一个是视频不播放这边优化了一下
var video = list[mViewPager.currentItem] as AdvanceVideoView
if (viewList.size > 0) {
if (viewList[mViewPager.currentItem] is AdvanceVideoView) {//有人反应第一个是视频不播放这边优化了一下
Logger.d("onPageScrollStateChanged", "第一个是视频")
val video = viewList[mViewPager.currentItem] as AdvanceVideoView
video.setVideo {
mViewPager.setCurrentItem(mViewPager.currentItem + 1, true)
Logger.d("onPageScrollStateChanged", "视频播放完成")
video.setCacheImageView(dataList[mViewPager.currentItem].cacheImgPath)
goNextItemView()
}
} else if (viewList[mViewPager.currentItem] is AdvanceImageView) {
Logger.d("onPageScrollStateChanged", "startTimer()_1")
current = 0//换页重新计算时间
startTimer()
}
}
}
@@ -76,24 +84,32 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager): PagerAdapter(
}
private fun addView(item: RotationItem) {
if (item.type === 1) { // 表示视频
var videoView = AdvanceVideoView(mContext)
if (item.type == 1) { // 表示视频
val videoView = AdvanceVideoView(mContext)
videoView.setCacheImageView(item.cacheImgPath)
videoView.setVideoPath(item.path)
viewList.add(videoView)
} else { // 表示图片
var imageView = AdvanceImageView(mContext)
val imageView = AdvanceImageView(mContext)
imageView.setImagePath(item.path)
viewList.add(imageView)
}
}
fun setPause(){
fun setPause() {
pause = true
if (viewList.size > 0 && viewList[mViewPager.currentItem] is AdvanceVideoView) {
val videoView = viewList[mViewPager.currentItem] as AdvanceVideoView
videoView.setPause()
}
}
fun setResume(){
fun setResume() {
pause = false
if (viewList.size > 0 && viewList[mViewPager.currentItem] is AdvanceVideoView) {
val videoView = viewList[mViewPager.currentItem] as AdvanceVideoView
videoView.setRestart()
}
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
@@ -105,26 +121,30 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager): PagerAdapter(
override fun onPageScrollStateChanged(state: Int) {
// 由于viewpager的预加载机制onPageSelected这里面加载videoview 放的跟玩一样 等操作完成后再播放videoview就香了 很丝滑
if (state == 0) { //静止,什么都没做
val currentItem = mViewPager.currentItem
Logger.d(
"onPageScrollStateChanged",
"state = $state currentItem = $currentItem lastPosition = $lastPosition"
)
if (viewList.size > 1) { //多于1才会循环跳转
if (lastPosition != -1 && lastPosition != mViewPager.currentItem
&& viewList[lastPosition] is AdvanceVideoView) {
var videoView: AdvanceVideoView = viewList[lastPosition] as AdvanceVideoView
&& viewList[lastPosition] is AdvanceVideoView
) {
val videoView: AdvanceVideoView = viewList[lastPosition] as AdvanceVideoView
videoView.setPause()
}
if (mViewPager.currentItem < 1) { //首位之前跳转到末尾N
var position = dataList.size //注意这里是mList而不是mViews
mViewPager.setCurrentItem(position, false)
} else if (mViewPager.currentItem > dataList.size) { //末位之后跳转到首位1
mViewPager.setCurrentItem(1, false) //false:不显示跳转过程的动画
}
current = 0//换页重新计算时间
if (viewList[mViewPager.currentItem] is AdvanceVideoView) {
(viewList[mViewPager.currentItem] as AdvanceVideoView).setVideo {
if (viewList[mViewPager.currentItem] is AdvanceVideoView) {
val videoView = (viewList[mViewPager.currentItem] as AdvanceVideoView)
videoView.setVideo {
videoView.setCacheImageView(dataList[mViewPager.currentItem].cacheImgPath)
mViewPager.setCurrentItem(mViewPager.currentItem + 1, true)
}
}else if (viewList[mViewPager.currentItem] is AdvanceImageView){
} else if (viewList[mViewPager.currentItem] is AdvanceImageView) {
Logger.d("onPageScrollStateChanged", "startTimer()")
current = 0//换页重新计算时间
startTimer()
}
lastPosition = mViewPager.currentItem
@@ -134,26 +154,45 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager): PagerAdapter(
private fun startTimer() {
if (null != thread && !thread?.isInterrupted!!) {
Logger.d("onPageScrollStateChanged", "thread.interrupt()")
thread?.interrupt()
thread = null
}
thread = Thread{
thread = Thread {
while (null != thread && !thread?.isInterrupted!!) {
try {
Logger.d("onPageScrollStateChanged", "sleep")
Thread.sleep(1000)
if (!pause && viewList[mViewPager.currentItem] !is AdvanceVideoView)
if (viewList[mViewPager.currentItem] is AdvanceImageView) {
Logger.d("onPageScrollStateChanged", "增加1s")
current += 1000
}
if (current >= time) {
mViewPager.post {
mViewPager.setCurrentItem(mViewPager.currentItem + 1, true)
}
Logger.d("onPageScrollStateChanged", "5s到跳转")
goNextItemView()
current = 0
break
}
} catch (e: InterruptedException) {
e.printStackTrace();
e.printStackTrace()
}
}
}
thread?.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)
}
}
}
}

View File

@@ -76,6 +76,7 @@ class AdvanceVideoView @JvmOverloads constructor(
}
videoView?.setOnCompletionListener(onCompletionListener)
}
fun setPause() {
@@ -93,32 +94,32 @@ class AdvanceVideoView @JvmOverloads constructor(
/**
* 加载首帧,作为视频缓存显示的图片
*/
private fun loadCacheImage(){
Thread {
var retriever = MediaMetadataRetriever()
var bitmap: Bitmap? = null
try {
if (path?.contains("http") == true){
retriever.setDataSource(path, HashMap<String,String>())
}else{
retriever.setDataSource(path)
}
bitmap = retriever.frameAtTime
}catch (ex: Exception){
ex.printStackTrace()
}finally {
try {
retriever.release()
}catch (e: RuntimeException){
e.printStackTrace()
}
}
if (bitmap != null) {
UiThreadHandler.post {
// private fun loadCacheImage(){
// Thread {
// var retriever = MediaMetadataRetriever()
// var bitmap: Bitmap? = null
// try {
// if (path?.contains("http") == true){
// retriever.setDataSource(path, HashMap<String,String>())
// }else{
// retriever.setDataSource(path)
// }
// bitmap = retriever.frameAtTime
// }catch (ex: Exception){
// ex.printStackTrace()
// }finally {
// try {
// retriever.release()
// }catch (e: RuntimeException){
// e.printStackTrace()
// }
// }
//
// if (bitmap != null) {
// UiThreadHandler.post {
// setCacheImageView(bitmap)
}
}
}
}
// }
// }
// }
// }
}

View File

@@ -7,7 +7,7 @@
<!-- 图片或视频广告-->
<com.mogo.och.bus.passenger.ui.widget.video.ImageAndVideoRotation
android:id="@+id/image_video_rotation_view"
android:id="@+id/imageVideoRotationView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>