Viewpager2禁止滑动的多个方面分析

Viewpager2是Android端的一个强大的滑动组件,可以轻松地实现左右滑动浏览、以及无限滑动等功能。但是,在实际应用中,有时也需要禁止Viewpager2的滑动功能,比如在某些情况下需要将Viewpager2嵌套在ScrollView中,这时如果不禁止Viewpager2的滑动,则Scrollview和Viewpager2的滑动会相互干扰,造成用户操作体验的下降。本文将从多个方面对Viewpager2的禁止滑动进行详细的阐述。

一、Viewpager2滑动监听

在Viewpager2上禁止滑动,可以通过自定义OnPageChangeCallback类来实现滑动监听并且在滑动操作时禁止轮播。具体实现如下:

“`
private class NoScrollOnPageChangeCallback extends ViewPager2.OnPageChangeCallback {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// 禁止滑动
}

@Override
public void onPageSelected(int position) {}

@Override
public void onPageScrollStateChanged(int state) {}
}
“`

在该类中,onPageScrolled()方法会被调用,只要用户在Viewpager2上左右滑动,该方法就会被调用,接下来只需要在该方法中实现禁止滑动功能即可,代码如下:

“`
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// 禁止滑动
viewPager2.stopScroll();
}
“`

利用该方法,我们可以在Viewpager2上轻松实现禁止滑动,保证用户在ScrollView中正常滑动。

二、Viewpager2上下滑动

有时候,需要在Viewpager2中添加纵向滑动的功能,此时便需要禁止Viewpager2的左右滑动,而允许上下滑动。实现方式如下:

“`
public class CustomViewPager2 extends ViewPager2 {
private boolean isPagingEnabled = true;

public CustomViewPager2(@NonNull Context context) {
super(context);
}

public CustomViewPager2(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}

public void setPagingEnabled(boolean pagingEnabled) {
isPagingEnabled = pagingEnabled;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
return isPagingEnabled && super.onTouchEvent(event);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return isPagingEnabled && super.onInterceptTouchEvent(event);
}
}
“`

在该类中,重写onTouchEvent()方法和onInterceptTouchEvent()方法,在需要禁止Viewpager2滑动时,将isPagingEnabled属性设置为false即可。接下来,在ScrollView中嵌套该CustomViewPager2即可实现上下滑动,而禁止左右滑动。

三、Viewpager2太容易左右滑动

有时候,用户可能会在很轻松的情况下误触Viewpager2而造成页面的切换,这时需要增加Viewpager2的敏感度,避免用户误触。我们可以通过设置ViewPager2的滑动阈值来解决该问题,代码如下:

“`
private final int TOUCH_THRESHOLD = 20;
private float mTouchDownX;

private class TouchController implements View.OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mTouchDownX = event.getX(0);
break;
case MotionEvent.ACTION_MOVE:
float moveX = event.getX(0);
if (Math.abs(moveX – mTouchDownX) > TOUCH_THRESHOLD) {
// 如果滑动距离大于阈值,禁止滑动
viewPager2.stopScroll();
}
break;
default:
break;
}
return false;
}
}
“`

该方法中,通过onTouch()方法监听Viewpager2上的滑动事件,在用户移动手指时,判断移动距离是否大于指定的阈值,如果大于,则禁止滑动。需要注意的是,该方法只有在监听到的ACTION_MOVE事件中进行判断,防止误判。

四、Viewpager2无限滑动

Viewpager2本身带有无限滑动的功能,即当用户滑动到最后一页时,再次滑动将会回到第一页。如果需要禁止上述功能,可以在Adapter中的getItemCount()方法中返回真实的Item个数,进而禁止无限滑动。代码如下:

“`
@Override
public int getItemCount() {
return realList.size();
}
“`

其中,realList为Viewpager2的真实Item列表。

五、Viewpager2禁止滑动完整代码示例

视不同功能需求,Viewpager2禁止滑动的代码实现可能有所不同,下面是一个完整的实现示例:

“`
public class MainActivity extends AppCompatActivity {
private CustomViewPager2 viewPager2;
private List dataList;
private TouchController touchController;
private NoScrollOnPageChangeCallback noScrollOnPageChangeCallback;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

viewPager2 = findViewById(R.id.viewPager2);
dataList = new ArrayList();
for (int i = 0; i < 5; i++) {
dataList.add(i + "");
}
viewPager2.setAdapter(new MyAdapter(dataList));

// Viewpager2上下滑动
touchController = new TouchController();
viewPager2.setOnTouchListener(touchController);

// Viewpager2滑动监听
noScrollOnPageChangeCallback = new NoScrollOnPageChangeCallback();
viewPager2.registerOnPageChangeCallback(noScrollOnPageChangeCallback);
}

class MyAdapter extends RecyclerView.Adapter {

private List list;

public MyAdapter(List list) {
this.list = list;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
TextView textView = new TextView(parent.getContext());
textView.setTextSize(30);
return new ViewHolder(textView);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.textView.setText(list.get(position));
}

@Override
public int getItemCount() {
return list.size();
}

class ViewHolder extends RecyclerView.ViewHolder {

public TextView textView;

public ViewHolder(@NonNull View itemView) {
super(itemView);
textView = (TextView) itemView;
}
}
}

private class NoScrollOnPageChangeCallback extends ViewPager2.OnPageChangeCallback {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// 禁止滑动
viewPager2.stopScroll();
}

@Override
public void onPageSelected(int position) {}

@Override
public void onPageScrollStateChanged(int state) {}
}

public class CustomViewPager2 extends ViewPager2 {
private boolean isPagingEnabled = true;

public CustomViewPager2(@NonNull Context context) {
super(context);
}

public CustomViewPager2(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}

public void setPagingEnabled(boolean pagingEnabled) {
isPagingEnabled = pagingEnabled;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
return isPagingEnabled && super.onTouchEvent(event);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return isPagingEnabled && super.onInterceptTouchEvent(event);
}
}

private final int TOUCH_THRESHOLD = 20;
private float mTouchDownX;

private class TouchController implements View.OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mTouchDownX = event.getX(0);
break;
case MotionEvent.ACTION_MOVE:
float moveX = event.getX(0);
if (Math.abs(moveX – mTouchDownX) > TOUCH_THRESHOLD) {
// 如果滑动距离大于阈值,禁止滑动
viewPager2.stopScroll();
}
break;
default:
break;
}
return false;
}
}
}
“`

六、总结

本文从多个方面对Viewpager2的禁止滑动进行了详细的阐述,通过自定义OnPageChangeCallback类对Viewpager2上的滑动进行监听,通过自定义CustomViewPager2类实现上下滑动和禁止左右滑动,通过设置滑动阈值和禁止无限滑动实现Viewpager2的各种功能。以上方法可以帮助开发者在需要禁止Viewpager2滑动时,保证用户体验,提高应用质量。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/308489.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2025-01-03 14:49
下一篇 2025-01-03 14:49

相关推荐

  • 为什么Python不能编译?——从多个方面浅析原因和解决方法

    Python作为很多开发人员、数据科学家和计算机学习者的首选编程语言之一,受到了广泛关注和应用。但与之伴随的问题之一是Python不能编译,这给基于编译的开发和部署方式带来不少麻烦…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • Python合并多个相同表头文件

    对于需要合并多个相同表头文件的情况,我们可以使用Python来实现快速的合并。 一、读取CSV文件 使用Python中的csv库读取CSV文件。 import csv with o…

    编程 2025-04-29
  • 从多个方面用法介绍yes,but let me review and configure level of access

    yes,but let me review and configure level of access是指在授权过程中,需要进行确认和配置级别控制的全能编程开发工程师。 一、授权确…

    编程 2025-04-29
  • 从多个方面zmjui

    zmjui是一个轻量级的前端UI框架,它实现了丰富的UI组件和实用的JS插件,让前端开发更加快速和高效。本文将从多个方面对zmjui做详细阐述,帮助读者深入了解zmjui,以便更好…

    编程 2025-04-28
  • 学Python用什么编辑器?——从多个方面评估各种Python编辑器

    选择一个适合自己的 Python 编辑器并不容易。除了我们开发的应用程序类型、我们面临的软件架构以及我们的编码技能之外,选择编辑器可能也是我们编写代码时最重要的决定之一。随着许多不…

    编程 2025-04-28
  • 使用easypoi创建多个动态表头

    本文将详细介绍如何使用easypoi创建多个动态表头,让表格更加灵活和具有可读性。 一、创建单个动态表头 easypoi是一个基于POI操作Excel的Java框架,支持通过注解的…

    编程 2025-04-28
  • 创建列表的多个方面

    本文将从多个方面对创建列表进行详细阐述。 一、列表基本概念 列表是一种数据结构,其中元素以线性方式组织,并且具有特殊的序列位置。该位置可以通过索引或一些其他方式进行访问。在编程中,…

    编程 2025-04-28
  • Python多个sheet表合并用法介绍

    本文将从多个方面对Python多个sheet表合并进行详细的阐述。 一、xlrd与xlwt模块的基础知识 xlrd与xlwt是Python中处理Excel文件的重要模块。xlrd模…

    编程 2025-04-27
  • 从多个角度用法介绍lower down

    lower down是一个常用于编程开发中的操作。它可以对某个值或变量进行降低精度的处理,非常适合于一些需要精度不高但速度快的场景。那么,在本文中,我们将从多个角度解析lower …

    编程 2025-04-27

发表回复

登录后才能评论