android viewpager 禁止滑动

android viewpager 禁止滑动

  • 前言
  • 一、viewpager 禁止滑动是什么,有现成方法吗?
  • 二、使用setOnTouchListener
  • 三、使用自定义viewpager
  • 总结

在这里插入图片描述


前言

本文介绍了本人有一个相关的需求需要实现这一功能,在过程中发现自己之前没做过,然后记录下实现这一功能的过程及相关的小知识点。


一、viewpager 禁止滑动是什么,有现成方法吗?

viewpager 禁止滑动,就是在特殊的条件,比如说编辑的状态下,是不允许用户滑动的,但是看了下viewpager 的源码,也百度了一下,并没有现成的API可以直接禁用调viewpager 的滑动,毕竟人家这个组件就是要滑动的,没有这个API也很正常。所以我们需要自己实现。

二、使用setOnTouchListener

自己实现嘛,一般来说就是能偷懒则偷懒的,先定义了一个isInterceptTouch的布尔值变量,在编辑态下设置为true,拦截事件。示例代码如下:

        mBinding.viewPager.setOnTouchListener(object : View.OnTouchListener{override fun onTouch(v: View?, event: MotionEvent?): Boolean {Log.d(TAG, "onTouch: $isInterceptTouch ${event?.action}")return isInterceptTouch}})

调试过后发现还是能滑动,就是不流畅了,所以动了个小脑筋,在滑动的时候再把页面设置回来。划了一下没问题交给测试小伙伴了。代码现在是这个样子:

        mBinding.viewPager.setOnTouchListener(object : View.OnTouchListener{override fun onTouch(v: View?, event: MotionEvent?): Boolean {Log.d(TAG, "onTouch: $isInterceptTouch ${event?.action}")if (isInterceptTouch){mBinding.viewPager.setCurrentItem(mPos,false)}return isInterceptTouch}})

三、使用自定义viewpager

然后把,就不出意外的出意外了,测试反馈说我一点一点的滑动,还是可以话,我试了下确实是这样,但是日志又打印的确实是true,表示确实把事件已经拦截了,我一下子脑子卡主了,想了好一会才反应过来。顺便带大家复习一下setOnTouchListener和onTouchEvent的区别

setOnTouchListener和onTouchEvent是Android中用于处理触摸事件的两种方法,它们有以下区别:

  1. 职责不同:onTouchEvent是View类中的一个方法,用于处理由View对象接收到的触摸事件。而setOnTouchListener则是View类的一个方法,它允许你为View对象设置一个OnTouchListener对象,这个对象可以响应View的触摸事件。
  2. 触发时机不同:当用户的触摸事件发生时,会最先由最内层的View对象(如按钮等)响应,如果该View对象没有消费该事件(即onTouch方法返回false),则会将事件传递给其父View对象,依此类推。如果最内层的View对象消费了该事件(即onTouch方法返回true),则该事件不会被传递给其父View对象。
  3. 处理方式不同:onTouchEvent是直接在View类中定义的方法,它的触发需要依赖传递过来的触摸事件信息。而setOnTouchListener则是为View对象设置了一个监听器,当用户的触摸事件发生时,会先由最内层的View对象响应,如果没有被消费,则会传递给其父View对象的onTouch方法;如果已经被消费,则不会传递给其父View对象的onTouch方法。

从复习结果上看当走到setOnTouchListener的时候,触摸事件其实已经被viewPager消费了,所以才会拦截不住,动歪脑筋设置setCurrentItem是没有用的。
因此,为了实现这一个需求,我不仅要自定义viewpager,使用onTouchEvent方法对触摸事件进行拦截,还要使用onInterceptTouchEvent防止其他子层级拿到消费事件。

再复习下onInterceptTouchEvent方法:这个方法主要存在于ViewGroup类中,用于拦截触摸事件。当返回值为false时,可以将点击事件传递到下层去;当返回值为true时,在这一层拦截点击事件,不能传递到下层去。

所以这个时候我的自定义viewpager就变成了这个样子

import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.MotionEvent
import androidx.viewpager.widget.ViewPagerclass NoScrollViewPager : ViewPager {companion object {private const val TAG = "NoScrollViewPager"}private var isScrollAllowed = trueconstructor(context: Context?) : super(context!!) {}constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs) {}override fun onTouchEvent(event: MotionEvent): Boolean {Log.d(TAG, "onTouchEvent: $isScrollAllowed")return if (isScrollAllowed) {super.onTouchEvent(event)} else false}override fun onInterceptTouchEvent(event: MotionEvent): Boolean {Log.d(TAG, "onInterceptTouchEvent: $isScrollAllowed")return if (isScrollAllowed) {super.onInterceptTouchEvent(event)} else false}fun setScrollAllowed(scrollAllowed: Boolean) {isScrollAllowed = scrollAllowed}
}

然后通过setScrollAllowed这个方法来控制是否禁止滑动ViewPager,这次没问题了。


总结

本文介绍了如何禁止Android中的ViewPager组件的滑动操作,由于ViewPager本就是为了滑动而设计的,因此并没有现成的API可以直接实现禁止滑动。通过自定义ViewPager并重写onTouchEvent和onInterceptTouchEvent方法,可以实现滑动拦截并禁止ViewPager的滑动操作。同时也介绍了setOnTouchListener和onTouchEvent的区别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/229256.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV | 傅里叶变换——低通滤波器与高通滤波器

import cv2 #opencv 读取的格式是BGR import numpy as np import matplotlib.pyplot as plt #Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() 傅里叶变换 傅里叶变换的作用 高频:变化剧烈…

【古月居《ros入门21讲》学习笔记】13_服务数据的定义与使用

目录 说明: 1. 服务模型 2. 实现过程(C) 自定义服务数据 Person.srv文件内容 Person.srv文件内容说明 编译配置 在package.xml文件中添加功能包依赖 在CMakeLists.txt中添加编译选项 编译生成语言相关文件 创建服务器代码&#xf…

亚马逊云科技Aurora MySQL在复制性能提升上的不断优化和尝试

前言 Amazon Aurora是亚马逊云科技自研的云原生关系数据库,它在提供和开源数据库MySQL、PostgreSQL的完好兼容性同时,也能够提供和商业数据库媲美的性能和可用性。 Aurora的性能提升不仅包含应用读写吞吐量的提升,也包含复制延迟的降低。一个…

【算法刷题】Day8

文章目录 202. 快乐数解法: 11. 盛最多水的容器解法: 202. 快乐数 原题链接 拿到题,我们先看题干 把一个整数替换为每个位置上的数字平方和,有两种情况: 重复这个过程始终不到 1(无限死循环)结…

移动应用开发介绍及iOS方向学习路线(HUT移动组版)

移动应用开发介绍及iOS方向学习路线(HUT移动组版) 前言 ​ 作为一个HUT移动组待了一坤年(两年半)多的老人,在这里为还在考虑进哪个组的萌新们以及将来进组的新朋友提供一份关于移动应用开发介绍以及学习路线的白话文…

Leetcode—2336.无限集中的最小数字【中等】

2023每日刷题&#xff08;四十四&#xff09; Leetcode—2336.无限集中的最小数字 实现代码 class SmallestInfiniteSet {set<int> s; public:SmallestInfiniteSet() {for(int i 1; i < 1000; i) {s.insert(i);}}int popSmallest() {int res *s.begin();s.erase(s…

2023年的 Web 前端开发建议需要具备技能

2023年的 Web 前端开发需要具备一系列技能&#xff0c;以应对不断变化的技术环境和满足日益增长的业务需求。以下是一些可能被视为必备的技能&#xff0c;以及为什么这些技能在当今前端开发中显得至关重要&#xff1a; 一、JavaScript、HTML、CSS&#xff1a; 为什么重要&…

盘点67个Android系统源码安卓爱好者不容错过

盘点67个Android系统源码安卓爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 源码下载链接&#xff1a;https://pan.baidu.com/s/1zOSFwPJwDJLFfoeRJy9llg?pwd8888 提取码&#xff1a;8888 项目名称 Accelera…

数字人透明屏幕的技术原理是什么?

数字人透明屏幕的技术原理主要包括人脸识别和全息影像技术。其中&#xff0c;人脸识别技术是通过摄像头捕捉游客的面部表情和动作&#xff0c;并将其转化为数据指令&#xff0c;以便与数字人物进行互动。而全息影像技术则是利用透明屏幕&#xff0c;通过全息投影的方式将数字人…

10k热敏电阻温度对照表

10k热敏电阻阻值温度对数图 10k热敏电阻温度对照表 温度&#xff08;℃&#xff09;欧姆 -4033660033660-3931500031500-3829500029500-3727640027640-3625900025900-3524280024280-3422780022780-3321380021380-3220060020060-3118840018840-3017700017700-2916640016640-28…

HCIP --- MGRE综合实验

一、总体规划 二、AR1配置思路及步骤 一、接口地址分配及缺省路由&#xff1a; The device is running! AR1&#xff1a; <Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]sy r1 [r1]interface s4/0/0 [r1-Serial4/0/0]ip address 15.0.0.1 255.0…

Spark---SparkCore(五)

五、Spark Shuffle文件寻址 1、Shuffle文件寻址 1&#xff09;、MapOutputTracker MapOutputTracker是Spark架构中的一个模块&#xff0c;是一个主从架构。管理磁盘小文件的地址。 MapOutputTrackerMaster是主对象&#xff0c;存在于Driver中。MapOutputTrackerWorker是从对…