Skip to content

Commit

Permalink
fix slider view auto play
Browse files Browse the repository at this point in the history
  • Loading branch information
biezhihua committed Feb 28, 2023
1 parent 88fd2c0 commit ecdf00d
Showing 1 changed file with 56 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ import android.content.Context
import android.graphics.Outline
import android.graphics.drawable.GradientDrawable
import android.os.Build
import android.os.Handler
import android.os.Looper
import android.util.AttributeSet
import android.view.Gravity
import android.view.MotionEvent
Expand All @@ -35,6 +33,7 @@ import com.alibaba.gaiax.context.GXTemplateContext
import com.alibaba.gaiax.render.view.*
import com.alibaba.gaiax.render.view.drawable.GXRoundCornerBorderGradientDrawable
import com.alibaba.gaiax.template.GXSliderConfig
import com.alibaba.gaiax.utils.GXLog
import java.util.*

/**
Expand All @@ -44,6 +43,10 @@ import java.util.*
class GXSliderView : FrameLayout, GXIContainer, GXIViewBindData, GXIRootView,
GXIRoundCorner, GXIRelease, GXIViewVisibleChange {

companion object {
private var SHOWN_VIEW_COUNT: Int = 0
}

enum class IndicatorPosition(val value: String) {
TOP_LEFT("top-left"),
TOP_CENTER("top-center"),
Expand All @@ -64,10 +67,6 @@ class GXSliderView : FrameLayout, GXIContainer, GXIViewBindData, GXIRootView,
}
}

companion object {
private const val TAG = "[GaiaX] [GXSliderView]"
}

constructor(context: Context) : super(context) {
initView()
}
Expand All @@ -76,6 +75,7 @@ class GXSliderView : FrameLayout, GXIContainer, GXIViewBindData, GXIRootView,
initView()
}

private var isAttached: Boolean = false
private var gxTemplateContext: GXTemplateContext? = null
private var config: GXSliderConfig? = null

Expand All @@ -87,15 +87,14 @@ class GXSliderView : FrameLayout, GXIContainer, GXIViewBindData, GXIRootView,
private var timer: Timer? = null
private var timerTask: TimerTask? = null

private val mainHandler = Handler(Looper.getMainLooper())

private fun initView() {
initViewPager()
}

private fun initViewPager() {
viewPager = ViewPager(context)
viewPager?.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
viewPager?.addOnPageChangeListener(object :
ViewPager.OnPageChangeListener {
override fun onPageScrolled(
position: Int,
positionOffset: Float,
Expand Down Expand Up @@ -123,6 +122,10 @@ class GXSliderView : FrameLayout, GXIContainer, GXIViewBindData, GXIRootView,
}

addView(viewPager, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT))

if (GXLog.isLog()) {
GXLog.e("GXSliderView initViewPager this=${this} viewPager=${viewPager}")
}
}

private fun initIndicator() {
Expand Down Expand Up @@ -199,8 +202,6 @@ class GXSliderView : FrameLayout, GXIContainer, GXIViewBindData, GXIRootView,
}

private fun updateView() {
stopTimer()

config?.selectedIndex?.let {
viewPager?.adapter?.count?.let { count ->
if (it in 0 until count) {
Expand All @@ -209,8 +210,6 @@ class GXSliderView : FrameLayout, GXIContainer, GXIViewBindData, GXIRootView,
}
}
}

startTimer()
}

fun setPageSize(size: Int) {
Expand All @@ -219,16 +218,21 @@ class GXSliderView : FrameLayout, GXIContainer, GXIViewBindData, GXIRootView,
}

private fun startTimer() {
// FIX
stopTimer()

config?.scrollTimeInterval?.let {
if (it > 0) {
timer = Timer()
timerTask = object : TimerTask() {
override fun run() {
if (GXLog.isLog()) {
GXLog.e("GXSliderView timerTask this=${this@GXSliderView} viewPager=${viewPager} timer=${timer} timerTask=${timerTask}")
}

viewPager?.currentItem?.let { currentItem ->
viewPager?.adapter?.count?.let { count ->
mainHandler.post {
viewPager?.post {
viewPager?.setCurrentItem(
(currentItem + 1) % count,
true
Expand All @@ -241,12 +245,19 @@ class GXSliderView : FrameLayout, GXIContainer, GXIViewBindData, GXIRootView,
timer?.schedule(timerTask, it, it)
}
}

if (GXLog.isLog()) {
GXLog.e("GXSliderView startTimer this=${this} viewPager=${viewPager} timer=${timer} timerTask=${timerTask}")
}
}

private fun stopTimer() {
if (GXLog.isLog()) {
GXLog.e("GXSliderView stopTimer this=${this} viewPager=${viewPager} timer=${timer} timerTask=${timerTask}")
}

timer?.cancel()
timerTask?.cancel()

timer = null
timerTask = null
}
Expand Down Expand Up @@ -304,11 +315,26 @@ class GXSliderView : FrameLayout, GXIContainer, GXIViewBindData, GXIRootView,
}

override fun release() {
if (GXLog.isLog()) {
GXLog.e("GXSliderView release this=${this@GXSliderView} viewPager=${viewPager}")
}

indicatorView = null
stopTimer()

// 只有第一个SliderView可以自动滚动,用于解决多频道轮播图同时滚动的问题
if (SHOWN_VIEW_COUNT > 0) {
SHOWN_VIEW_COUNT--
}
}

override fun onVisibleChanged(visible: Boolean) {
if (GXLog.isLog()) {
GXLog.e("GXSliderView onVisibleChanged this=${this@GXSliderView} viewPager=${viewPager} visible=${visible} isAttached=${isAttached}")
}
if (!isAttached) {
return
}
if (visible) {
startTimer()
} else {
Expand All @@ -317,12 +343,25 @@ class GXSliderView : FrameLayout, GXIContainer, GXIViewBindData, GXIRootView,
}

override fun onAttachedToWindow() {
isAttached = true
super.onAttachedToWindow()
updateView()
if (GXLog.isLog()) {
GXLog.e("GXSliderView onAttachedToWindow this=${this@GXSliderView} viewPager=${viewPager}")
}

// 只有第一个SliderView可以自动滚动,用于解决多频道轮播图同时滚动的问题
if (SHOWN_VIEW_COUNT <= 0) {
SHOWN_VIEW_COUNT = 0
SHOWN_VIEW_COUNT++
startTimer()
}
}

override fun onDetachedFromWindow() {
isAttached = false
super.onDetachedFromWindow()
stopTimer()
if (GXLog.isLog()) {
GXLog.e("GXSliderView onDetachedFromWindow this=${this@GXSliderView} viewPager=${viewPager}")
}
}
}

0 comments on commit ecdf00d

Please sign in to comment.