欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

ViewPager2滑动冲突的解决方法

程序员文章站 2022-06-09 19:12:09
viewpager2滑动冲突解决,供大家参考,具体内容如下本文章对viewpager2的滑动冲突没有提供完善的解决方案,仅为巩固解决滑动冲突方面的知识首先看看没有解决滑动冲突时写的demo:maina...

viewpager2滑动冲突解决,供大家参考,具体内容如下

本文章对viewpager2的滑动冲突没有提供完善的解决方案,仅为巩固解决滑动冲突方面的知识

首先看看没有解决滑动冲突时写的demo:

mainactivity.java

package com.example.banner

import androidx.appcompat.app.appcompatactivity
import android.os.bundle
import androidx.viewpager2.widget.viewpager2

class mainactivity : appcompatactivity() {
 override fun oncreate(savedinstancestate: bundle?) {
 super.oncreate(savedinstancestate)
 setcontentview(r.layout.activity_main)
 val viewpager2 = findviewbyid<viewpager2>(r.id.viewpager2outside)
 val myadapter = outsideadapter()
 viewpager2.adapter = myadapter
 }
}

inneradapter

package com.example.banner

import android.graphics.color
import android.view.layoutinflater
import android.view.view
import android.view.viewgroup
import android.widget.textview
import androidx.recyclerview.widget.recyclerview

class inneradapter : recyclerview.adapter<inneradapter.pagerviewholder>() {
 private var mlist: list<int> = arraylist()
 override fun oncreateviewholder(parent: viewgroup, viewtype: int): pagerviewholder {
 val itemview = layoutinflater.from(parent.context).inflate(r.layout.item_page, parent, false)
 return pagerviewholder(itemview)
 }

 override fun onbindviewholder(holder: pagerviewholder, position: int) {
 holder.binddata(mlist[position])
 }

 fun setlist(list: list<int>) {
 mlist = list
 }

 override fun getitemcount(): int {
 return mlist.size
 }
 // viewholder需要继承recycleview.viewholder
 class pagerviewholder(itemview: view) : recyclerview.viewholder(itemview) {
 private val mtextview: textview = itemview.findviewbyid(r.id.tv_text)
 private var colors = arrayof("#41f1e5","#8d41f1","#ff99cc","#41f1e5")

 fun binddata(i: int) {
  mtextview.text = i.tostring()
  mtextview.setbackgroundcolor(color.parsecolor(colors[i]))
 }
 }
}

outsideadapter

package com.example.banner

import android.view.layoutinflater
import android.view.view
import android.view.viewgroup
import androidx.recyclerview.widget.recyclerview
import androidx.viewpager2.widget.viewpager2

class outsideadapter() : recyclerview.adapter<outsideadapter.pagerviewholder>() {
 class pagerviewholder(itemview: view) : recyclerview.viewholder(itemview) {
 private val mpagerview: viewpager2 = itemview.findviewbyid(r.id.viewpager2inner)
 fun binddata() {
  val data = listof(0, 1, 2, 3)
  val myadapter = inneradapter()
  myadapter.setlist(data)
  mpagerview.adapter = myadapter
 }
 }

 override fun oncreateviewholder(parent: viewgroup, viewtype: int): pagerviewholder {
 val itemview = layoutinflater.from(parent.context).inflate(r.layout.item_outside, parent, false)
 return pagerviewholder(itemview)
 }

 override fun onbindviewholder(holder: pagerviewholder, position: int) {
 holder.binddata()
 }

 override fun getitemcount(): int = 2

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.constraintlayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context=".mainactivity">

 <androidx.viewpager2.widget.viewpager2
 android:id="@+id/viewpager2outside"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:overscrollmode="never"
 app:layout_constraintbottom_tobottomof="parent"
 app:layout_constraintleft_toleftof="parent"
 app:layout_constraintright_torightof="parent"
 app:layout_constrainttop_totopof="parent" />

</androidx.constraintlayout.widget.constraintlayout>

item_outside.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.constraintlayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical">

 <androidx.viewpager2.widget.viewpager2
 android:id="@+id/viewpager2inner"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:overscrollmode="never"
 app:layout_constraintbottom_tobottomof="parent"
 app:layout_constraintleft_toleftof="parent"
 app:layout_constraintright_torightof="parent"
 app:layout_constrainttop_totopof="parent" />
</androidx.constraintlayout.widget.constraintlayout>

item_page.xml

<?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:gravity="center">

 <textview
 android:id="@+id/tv_text"
 android:background="#0000ff"
 android:gravity="center"
 android:layout_centerhorizontal="true"
 android:layout_width="match_parent"
 android:layout_height="280dp"
 android:textcolor="#ffffff"
 android:textsize="82sp" />
</relativelayout>

效果如下:

ViewPager2滑动冲突的解决方法

如果解决了滑动冲突应该在textview对应的区域滑动时应该能从0滑动到1,而导致图中效果的原因是因为外层的viewpager2拦截了横向的滑动事件,因为viewpager2是final不能继承,所以我们给它套一层父viewgroup来解决滑动冲突问题,这里我是在外面的viewpager2里面放了俩个viewpager2 我想做到的是从第一个里面的vp2(viewpager2)0划到1再到2到3再到里面的第二个vp2的0再到1再到2再到3,而不是直接从第一个里面的vp2(viewpager2)0滑倒里面的第二个vp2的0。

下面上源码,只上有改动的代码,像mainactivity及activity_main.xml等没有改动就不再上了

viewpager2container

package com.example.banner

import android.content.context
import android.util.attributeset
import android.view.motionevent
import android.widget.relativelayout
import androidx.viewpager2.widget.viewpager2

class viewpager2container @jvmoverloads constructor(context: context, attrs: attributeset? = null, defstyleattr: int = 0) : relativelayout(context, attrs, defstyleattr) {
 private lateinit var mviewpager2: viewpager2

 override fun onfinishinflate() {
 super.onfinishinflate()
 for (i in 0 until childcount) {
  val childview = getchildat(i)
  if (childview is viewpager2) {
  mviewpager2 = childview
  break
  }
 }
 }

 override fun onintercepttouchevent(ev: motionevent): boolean {
 when (ev.action) {
  //不能让父view拦截事件否则父view会拦截接下来的一系列事件
  motionevent.action_down -> {
  parent.requestdisallowintercepttouchevent(true)
  }
  motionevent.action_move -> {
  if(mviewpager2.currentitem!=mviewpager2.adapter!!.itemcount-1){
   parent.requestdisallowintercepttouchevent(true)
  }else{
   parent.requestdisallowintercepttouchevent(false)
  }
  }
 }
 return super.onintercepttouchevent(ev)
 }
}

item_outside.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.constraintlayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical">

 <com.example.banner.viewpager2container
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 app:layout_constrainttop_totopof="parent">

 <androidx.viewpager2.widget.viewpager2
  android:id="@+id/viewpager2inner"
  android:layout_width="match_parent"
  android:layout_height="280dp"
  android:overscrollmode="never" />
 </com.example.banner.viewpager2container>


</androidx.constraintlayout.widget.constraintlayout>

当然我这样写还是有些东西没有考虑到的,我这里的解决方案仅提供一种解决思路,不去考虑很完善的解决方案

对于我上面写的代码,在滑到里面的第二个vp2的3时再向左滑动时会直接滑到里面的第一个vp2,具体怎么解决很简单

我这里的解决方案仅提供一种解决思路,主要是巩固怎么解决滑动冲突方面的知识!

最后上效果图

ViewPager2滑动冲突的解决方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。