Viewpager2切換視頻播放,要求禁止某個視頻禁止上劃或者下滑

1 以下的場景都是乙各,使用viewpager2實現(xiàn)了抖音視頻切換播放的場景邏輯
需求是 要求觀看到某一集視頻要求該視頻必須完整看完墨礁,才能切換到下一集視頻。
此刻 我們必須將viewpager2切換到當前的fragment進行上滑攔截耳峦,或者上滑攔截

2 大家通常的用法是重寫viewpager2恩静,但是 viewpager2 是final類型,禁止重寫蹲坷。我們只能另尋方案

3 可能大家會覺得比較簡單驶乾,但是你測試的時候會發(fā)現(xiàn),如果上劃一下段距離循签,在下拉 必然可以拉倒下一個item级乐,攔截事件只有在當前的item在屏幕底部的時候有效,有時候就無法攔截县匠,這個很煩躁风科。

4 解決方法是 它本身是用了recycleview,你可以把他當成這個乞旦。也就是說 我們需要監(jiān)聽每一個recycleview的item的 touch事件贼穆,進行實踐攔截。

5 上代碼
1
override fun onStart() {
super.onStart()
setScroll()
}

private fun setScroll() {
    // Initialize the NoSwipeItemTouchListener with default settings
    noSwipeListener = NoSwipeItemTouchListener(
        currentpostion,
        requireContext(),
        disableUpScroll = false,
        disableDownScroll = false
    )
    touchInterceptor = ViewPagerTouchInterceptor(getViewPager())

// touchInterceptor.addTouchInterceptorToViewPager(noSwipeListener)
// 上劃和下滑都可以滑動
setVerticalScroll(true, true)

}

// 設(shè)置是否可以上劃或者下滑 false 不可以滑動 true 可以滑動
fun setVerticalScroll(up: Boolean, down: Boolean) {
    // Remove existing listener
    touchInterceptor?.removeTouchInterceptorFromViewPager()
    // Create a new listener with updated settings
    noSwipeListener = NoSwipeItemTouchListener(
        currentpostion,
        requireContext(),
        disableUpScroll = up,
        disableDownScroll = down
    )
    touchInterceptor.addTouchInterceptorToViewPager(noSwipeListener)
}

override fun onDestroy() {
    super.onDestroy()
    RecrodTypeManager.setUserFeed("play")
    touchInterceptor?.removeTouchInterceptorFromViewPager()
    touchInterceptor == null
}

2 攔截器兰粉,重點就是 move方法里的故痊,我要獲取 rv.scrollToPosition(position)
,這個方法在你向下滑動后玖姑,如果突然向上滑動愕秫,我們要進行攔截慨菱,不然此時快速切換,是可以滑動到下一個item的豫领,我們要滑動回當前位置抡柿。這個是重點
class NoSwipeItemTouchListener(
private val position: Int,
context: Context,
private val disableUpScroll: Boolean = false,
private val disableDownScroll: Boolean = false
) : RecyclerView.OnItemTouchListener {

//    private var startY = 0f
private val threshold = 5 // 滑動閾值,根據(jù)需要調(diào)整

private var startX = 0f
private var startY = 0f
private var lastX = 0f
private var lastY = 0f

private var diffY = 0f
override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {}

override fun onInterceptTouchEvent(rv: RecyclerView, event: MotionEvent): Boolean {
    when (event.action) {
        MotionEvent.ACTION_DOWN -> {

// startY = e.y

            startX = event.x
            startY = event.y
            lastX = startX
            lastY = startY
        }

        MotionEvent.ACTION_MOVE -> {
            val currentX = event.x
            val currentY = event.y
            val diffX = currentX - lastX
            diffY = currentY - lastY

            if (Math.abs(diffX) > threshold || Math.abs(diffY) > threshold) {
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    // 左右滑動
                    if (diffX > 0) {
                        onSwipeRight()
                    } else {
                        onSwipeLeft()
                    }
                } else {
                    // 上下滑動
                    if (diffY > 0) {

// LogUtil.d("diffY", "diffY: diffY") onSwipeDown() //如果向下滑動禁止了 則攔截這個事件 if (!disableDownScroll) { return true } } else { onSwipeUp() LogUtil.d("diffY", "diffY:diffY")
//如果向上滑動禁止了 則攔截這個事件 等恐,并且回到原位
if (!disableUpScroll) {
if (diffY<-5){
rv.scrollToPosition(position)
LogUtil.d("scrollToPosition", "scrollToPosition")
}
return true
}
}
}

                // 更新lastX和lastY以適應(yīng)連續(xù)滑動
                lastX = currentX
                lastY = currentY
            }
        }

        MotionEvent.ACTION_UP,MotionEvent.ACTION_CANCEL -> {
            // 結(jié)束時重置狀態(tài)
            startX = 0f
            startY = 0f
            lastX = 0f
            lastY = 0f
        }
    }
    return false
}

private fun onSwipeRight() {
    LogUtil.d("SwipeDirection", "Detected right")
    // 處理向右滑動邏輯
}

private fun onSwipeLeft() {
    LogUtil.d("SwipeDirection", "Detected left")
    // 處理向左滑動邏輯
}

private fun onSwipeUp() {
    LogUtil.d("SwipeDirection", "Detected up")
    // 處理向上滑動邏輯
}

private fun onSwipeDown() {
    LogUtil.d("SwipeDirection", "Detected down")
    // 處理向下滑動邏輯
}

override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}

}

3 viewpager2 設(shè)置每一個item的監(jiān)聽方法
class ViewPagerTouchInterceptor(private val viewPager: ViewPager2?) {

private var recyclerView: RecyclerView? = null
private var listener: RecyclerView.OnItemTouchListener? = null

init {
    recyclerView = getRecyclerViewFromViewPager(viewPager)
}

private fun getRecyclerViewFromViewPager(viewPager: ViewPager2?): RecyclerView? {
    for (i in 0 until (viewPager?.childCount ?: 0)) {
        val child = viewPager?.getChildAt(i)
        if (child is RecyclerView) {
            return child
        }
    }
    return null
}

fun addTouchInterceptorToViewPager(listener: RecyclerView.OnItemTouchListener) {
    this.listener = listener
    recyclerView?.addOnItemTouchListener(listener)
}

fun removeTouchInterceptorFromViewPager() {
    listener?.let {
        recyclerView?.removeOnItemTouchListener(it)
    }
}

}

4 里面的getviewpager是我項目里的實例洲劣,自己自行替換即可

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市课蔬,隨后出現(xiàn)的幾起案子囱稽,更是在濱河造成了極大的恐慌,老刑警劉巖二跋,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件战惊,死亡現(xiàn)場離奇詭異,居然都是意外死亡扎即,警方通過查閱死者的電腦和手機吞获,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谚鄙,“玉大人各拷,你說我怎么就攤上這事∶朴” “怎么了烤黍?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長傻盟。 經(jīng)常有香客問我速蕊,道長,這世上最難降的妖魔是什么娘赴? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任规哲,我火速辦了婚禮,結(jié)果婚禮上筝闹,老公的妹妹穿的比我還像新娘媳叨。我一直安慰自己,他們只是感情好关顷,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布糊秆。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上核无,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天艺骂,我揣著相機與錄音汞舱,去河邊找鬼伍纫。 笑死,一個胖子當著我的面吹牛昂芜,可吹牛的內(nèi)容都是我干的莹规。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼泌神,長吁一口氣:“原來是場噩夢啊……” “哼良漱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起欢际,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤母市,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后损趋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體患久,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年浑槽,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒋失。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡桐玻,死狀恐怖高镐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情畸冲,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布观腊,位于F島的核電站邑闲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏梧油。R本人自食惡果不足惜苫耸,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望儡陨。 院中可真熱鬧褪子,春花似錦、人聲如沸骗村。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胚股。三九已至笼痛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缨伊。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工摘刑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刻坊。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓枷恕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谭胚。 傳聞我的和親對象是個殘疾皇子徐块,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容