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.mzph.cn/news/181266.shtml

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

相关文章

服务器运行情况及线上排查问题常用命令

一、top命令 指令行: top返回: 返回分为两部分 (一)系统概览,见图知意 以下是几个需要注意的参数 1、load average: 系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分…

MES系统数字化看板:生产过程透明化与优化

在当今的制造业中,实现生产过程的透明化和优化已成为企业持续发展的关键。MES系统(制造执行系统)作为实现这一目标的重要工具,其数字化看板功能在生产现场管理中发挥着越来越重要的作用。 一、MES系统的基本概念与功能 MES系统是…

Pod控制器简介,ReplicaSet、Deployment、HPA三种处理无状态pod应用的控制器介绍

目录 一.Pod控制器简介 二.ReplicaSet(简写rs) 1.简介 (1)主要功能 (2)rs较完整参数解释 2.创建和删除 (1)创建 (2)删除 3.扩容和缩容 &#xff08…

0基础学习VR全景平台篇第124篇:VR视频地拍补地 - PR软件教程

上课!全体起立~ 大家好,欢迎观看蛙色官方系列全景摄影课程! 嗨,大家好,今天我们来介绍【地拍VR视频补地】。 之前已经教给了大家如何处理航拍图片的补天和航天视频的补天,肯定有很多小伙伴也在好奇&…

三大录屏软件推荐,让你轻松录制屏幕

录屏软件的应用变得越来越广泛,无论是记录屏幕上的内容以方便日后查阅,还是与他人分享操作过程,录屏软件都发挥着重要作用。然而,市面上的录屏软件种类繁多,质量参差不齐。那有没有好用的录屏软件推荐呢?在…

吃火锅(Python)

题目描述 吃火锅 以上图片来自微信朋友圈:这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”,那就厉害了,我们的故事就开始了。 本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1。…

第二证券:机构密集调研消费电子、半导体产业链

据上海证券报记者核算,近一个月来,共有41家消费电子类公司和92家半导体公司(核算标准:申万职业2021,下同)发布出资者调研纪要。其间,有的公司款待了16个批次估计超200家安排,更有公司…

【九】linux下部署frp客户端服务端实践(内网穿透)

linux下部署frp客户端服务端实践 简介: 今天有一个这样的需求,部署在公司内部局域网虚拟机上的服务需要在外网能够访问到,这不就是内网穿透的需求吗,之前通过路由器实现过,现在公司这块路由器不具备这个功能了&#x…

linux获得帮助_如何查看命令的用法、作用

Linux获得帮助 多层次的帮助: whatis command --help man and info /usr/share/doc/ Red Hat documentation 、Ubuntu documentation 软件项目网站 其它网站 搜索 whatis 使用数据库来显示命令的简短描述。 [rootlocalhost ~]# whatis rm rm (1) …

详解Object.defineProperty()方法

Object.defineProperty是一个用于定义或修改对象属性的方法。它提供了一种更底层和灵活的方式来定义属性,可以设置属性的配置(如可枚举性、可配置性、可写性等),并且可以定义属性的getter和setter函数。 语法: Objec…

Lesson 08 string类 (上)

C:渴望力量吗,少年? 文章目录 一、STL1. 概念2. STL的六大组件3. STL的重要性 二、string类的介绍与使用1. 介绍2. 使用(1)string类对象的常见构造(2)string类对象的容量操作(3&…

数字人透明屏幕是如何工作的?

数字人透明屏幕是一种令人兴奋的科技产品,它结合了人脸识别、全息影像技术以及透明屏幕,为人们带来了全新的互动体验。本文将详细介绍数字人透明屏幕的工作原理以及其应用场景。 工作原理 数字人透明屏幕的工作原理主要包括人脸识别和全息影像技术。人脸…

数学建模-基于LightGBM和BP神经网络的互联网招聘需求分析与预测

基于LightGBM和BP神经网络的互联网招聘需求分析与预测 整体求解过程概述(摘要) 就业是民生之本,是发展之基,也是安国之策。2020 年新冠肺炎疫情的爆发,稳就业成为应对疫情、稳定社会的重要保障之一。随着数据新动能的发展,互联网…

用CHAT总结费曼学习法的关键

问CHAT:费曼学习法的关键 CHAT回复:费曼学习法是由著名物理学家理查德费曼所发明的一种学习方法,旨在以深入理解为目标,帮助自己学习新的知识和技能。 费曼学习法有四个关键步骤: 1. 学习:首先&#xff0…

阿里云服务器2核2G3M配置购买和续费同享99元1年,最后2天赶紧囤货

经济型e实例2核2G 3M固定带宽 40G ESSD Entry云盘,价格为99元1年,这款云服务器是阿里云在11月份推出的特价云服务器,不管是用户还是老用户,都觉得这个价格确实非常划算,但是有的用户觉得现在暂时没有使用云服务器的需求…

LLM大语言模型

大语言模型的定义 大语言模型(英文:Large Language Model,缩写LLM),也称大型语言模型,是一种人工智能模型,旨在理解和生成人类语言。它们在大量的文本数据上进行训练,可以执行广泛的…

在Rust中处理命令行参数和环境变量

1.摘要 Rust的命令行和环境变量处理在标准库中提供了一整套实现方法, 在本文中除了探索标准库的使用方法之外, 也在不断适应Rust独有的语法特点。在本文中, 我们通过标准库函数的返回值熟悉了迭代器的使用方法, 操作迭代器精确控制保存的内容, 包括字符串和键值对的使用方法。…

美创科技受邀亮相第二届全球数字贸易博览会

11月23日-27日,由浙江省人民政府、商务部共同主办的第二届全球数字贸易博览会(以下简称“数贸会”)圆满落幕。围绕“国家级、国际性、数贸味”的目标定位,以“数字贸易 商通全球”为主题,数贸会重点展示数字贸易全产业…

伪原创工具,免费的5款伪原创工具

寻找一款合适的伪原创工具是提高写作效率的重要一环。在这里,我们为您推荐了五款不同特点的伪原创工具,并对它们进行了详细的测评。 第一款伪原创工具:147SEO改写 147SEO改写是一款强大的AI智能伪原创写作工具,具备多个模板供用…

亚马逊云科技 re:Invent 2023:科技前沿风向标

一、前言 亚马逊云科技 re:Invent 2023 已于内华达州的拉斯维加斯盛大举行。 re:Invent 2023 直播活动地址:https://webinar.amazoncloud.cn/reInvent2023/ 关注参加 re:Invent 大会你将有机会参与学习、交流,聆听专家演讲,并观看 Amazon …