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,一经查实,立即删除!

相关文章

Linux-文件夹文件赋权、文件指定修改用户和用户组

Linux-文件夹文件赋权、文件指定修改用户和用户组 文件权限说明文件夹文件赋权chmod命令chmod示例以数字方式修改权限给指定目录赋权给当前目录的所有子文件夹和文件赋权 chown修改属主、属组 文件权限说明 文件或目录的权限位是由9个权限位来控制的,每三位一组&am…

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

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

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

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

分页实体类封装

请求实体 /*** author suran* description 分页实体* create 2023/11/29 9:31*/ public class PageQuery implements Serializable {private Integer pageNum 1;private Integer page 1;private Integer pageSize 20;public PageQuery() {}public static PageQuery of(int …

IP地址的最后一位不可以为0或255

说明 通常情况下,IP 地址的最后一位不能为 0 或 255。这是因为这些特定的 IP 地址有特殊用途。 IP 地址的最后一位为 0 通常用作网络地址,表示整个网络的起始地址。IP 地址的最后一位为 255 通常用作广播地址,用于将数据包发送到同一网络中…

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…

Vue3的reactive、ref、toRef、toRefs用法以及区别

在 Vue3 中,reactive, ref, toRef, toRefs 都是用于创建响应式数据的方法。它们之间的主要区别在于它们的使用方式和返回值类型。 reactive:用于将一个普通对象转换为响应式对象。当对象的属性发生变化时,视图会自动更新。 import { reacti…

代洋集团:打造太阳能光伏电站的新标杆

随着全球对可再生能源的关注度不断提高,代洋集团以其卓越的技术和高效的运营,引领太阳能光伏电站的发展。通过持续的创新和研发,代洋集团成功构建了具有行业领先水平的太阳能光伏电站,为全球绿色能源产业贡献力量。 代洋集团的太…

python循环调用http示例(一定时间duration内,每隔时间interval去调用一次)call_http()

文章目录 直接上代码 直接上代码 #!/usr/bin/env python3 # -*- coding: utf-8 -*- import requests encoding utf-8def call_http_duration(server_ip, duration, interval):"""在时间 duration 内,每隔interval去调用 call_http(server_ip) 函数…

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…

【华为OD题库-042】战场索敌-java

题目 有一个大小是N * M的战场地图,被墙壁’#‘分隔成大小不同的区域,上下左右四个方向相邻的空地∵,属于同一个区域,只有空地上可能存在敌人’E’,请求出地图上总共有多少区域里的敌人数小于K。 输入描述 第一行输入为…

WT588FM01高性能录音语音芯片模块IC:远距离录音,卓越音质,多功能一体

在音频技术不断进步的今天,一款高性能的录音模块对于很多产品来说都是不可或缺的。唯创知音的WT588FM01就是这样一款令人瞩目的高性能录音语音芯片模块。它拥有远距离录音能力,出色的音质,以及直接推动8ohm/0.5W喇叭输出的功能,为…

【传送点】上千漏洞复现复现集合 exp poc 持续更新

一 简介 二 传送 【漏洞复现】OpenTSDB 2.4.0 命令注入(CVE-2020-35476)漏洞复现 【漏洞复现】熊海cms 存在sql注入 附poc 【漏洞复现】Array VPN任意文件读取漏洞 【漏洞复现】好视通视频会议系统(fastmeeting) toDownload.do接口存在任意文件读取漏洞 附POC 【漏洞复现】金…

Lesson 08 string类 (上)

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