[M2] 1、图/视频轮播优化
This commit is contained in:
@@ -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",
|
||||
"小宝宝"
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
@@ -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"/>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user