Android下拉刷新与轮播图滑动冲突解决方案

发布时间 - 2026-01-10 22:54:51    点击率:

最近在开发中遇到了这样一个问题,在下拉刷新组件中包含了一个轮播图组件,当左右滑动的图片时很容易触发下拉刷新,如下图所示:

如图中红色箭头所示方向切换轮播图,很容易触发下拉刷新。网上查了很多方法,发现都不能很好的解决,于是自己研究了下。

我选用的第三方控件

1.下拉刷新我选用的是chanven的CommonPullToRefresh(系统自带的SwipeRefreshLayout也应该是一样的道理);

2.轮播图选用的是daimajia的AndroidImageSlider(用ViewPager也是一样的道理)。具体界面自行脑补哈。

解决方案

我们仔细分析一下,我们要解决的实际上就是控件的事件拦截问题。现在的情况是外层的控件已经拦截了斜着滑动的事件,那么我们只要让外层的控件把这个事件分发下去就可以了【在dispatchTouchEvent(MotionEvent ev)方法中处理】,那么问题来了,怎么判断斜着的事件。网上有很多方案,但都不是很完美。我想到了一种,跟大家分享一下,先看图:

方案分析

1.图一中x=y,作为临界条件,这时α刚好等于45°;

2.图二中x<y,α>45°,这时我们判断为上下移动;

3.图三中x>y,α<45°,这时我们判断为左右移动。

那么我们只要判断tan(α)与tan(45)的关系就能判断是左右还是上下移动。我们写一个类继承PtrClassicFrameLayout,下面是关键代码:

public class SubPtrClassicFrameLayout extends PtrClassicFrameLayout {

  private float mDownX;
  private float mDownY;

  public SubPtrClassicFrameLayout(Context context) {
    super(context);
  }

  public SubPtrClassicFrameLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public SubPtrClassicFrameLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
      case MotionEvent.ACTION_DOWN:
        mDownX = ev.getX();
        mDownY = ev.getRawY();
        break;
      case MotionEvent.ACTION_MOVE:
        float moveX = ev.getX();
        float moveY = ev.getRawY();
        float diffX = Math.abs(moveX - mDownX);
        float diffY = Math.abs(moveY - mDownY);
        boolean isHorizon = Math.tan(diffY / diffX) < Math.tan(45.0);
        if (isHorizon) {
          return dispatchTouchEventSupper(ev);
        }
        break;
    }
    return super.dispatchTouchEvent(ev);
  }

}

我们可以看到,其实很简单,关键就是判断当前位置相对于初始位置的滑动方向。

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


# Android下拉刷新  # 冲突  # webview下拉刷新  # Android滑动冲突  # Android自定义控件实现简单的轮播图控件  # Android ViewPager实现轮播图效果  # Android自定义控件实现优雅的广告轮播图  # Android实现基于ViewPager的无限循环自动播放带指示器的轮播图CarouselFigur  # Android如何使用RecyclerView打造首页轮播图  # 简单实现android轮播图  # Android开发在轮播图片上加入点击事件的方法  # Android实现轮播图无限循环效果  # Android实现ViewPage轮播图效果  # android常见手动和自动轮播图效果  # 的是  # 很容易  # 所示  # 斜着  # 我想  # 来了  # 很好  # 就能  # 有很多  # 是一样的  # 网上  # 不是很  # 可以看到  # 要让  # 一个问题  # 相对于  # 第三方  # 大家分享  # 也应  # 三中 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  如何在服务器上配置二级域名建站?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Laravel集合Collection怎么用_Laravel集合常用函数详解  javascript读取文本节点方法小结  Laravel如何使用Service Container和依赖注入?(代码示例)  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  教你用AI润色文章,让你的文字表达更专业  如何在香港免费服务器上快速搭建网站?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  七夕网站制作视频,七夕大促活动怎么报名?  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  如何安全更换建站之星模板并保留数据?  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  装修招标网站设计制作流程,装修招标流程?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  Android自定义控件实现温度旋转按钮效果  Laravel如何实现用户密码重置功能?(完整流程代码)  C#如何调用原生C++ COM对象详解  长沙企业网站制作哪家好,长沙水业集团官方网站?  Python制作简易注册登录系统  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  Bootstrap整体框架之CSS12栅格系统  如何快速搭建高效可靠的建站解决方案?  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  Laravel怎么使用Intervention Image库处理图片上传和缩放  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  高端建站三要素:定制模板、企业官网与响应式设计优化  Laravel如何生成URL和重定向?(路由助手函数)  如何基于云服务器快速搭建个人网站?  如何基于云服务器快速搭建网站及云盘系统?  如何快速搭建FTP站点实现文件共享?  用yum安装MySQLdb模块的步骤方法  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  文字头像制作网站推荐软件,醒图能自动配文字吗?  如何用低价快速搭建高质量网站?  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  如何选择可靠的免备案建站服务器?  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  javascript中对象的定义、使用以及对象和原型链操作小结  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  Python函数文档自动校验_规范解析【教程】  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  香港网站服务器数量如何影响SEO优化效果?