iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android View 事件防抖的两种方案
  • 623
分享到

Android View 事件防抖的两种方案

2024-04-02 19:04:59 623人浏览 泡泡鱼
摘要

目录两种方案侵入式防抖处理(NoShakeClickListener)Java 版本Kotlin版本RxJava2 clickExt.kt无侵入式防抖处理(NoShakeClickL

两种方案

  • 侵入式防抖处理(NoShakeClickListener) implements View.OnClickListener
  • 无侵入式防抖处理(NoShakeClickListener2) not implements View.OnClickListener

侵入式防抖处理(NoShakeClickListener)

1. 既适用于单个View事件防抖, 也适用于Adapter中ItemView事件防抖

2. 如果事件为跳转到新的Activity, 该Activity启动模型应为Android:launchMode="singleTop"

Java 版本


public abstract class NoShakeClickListener implements View.OnClickListener {

  private long mTimeInterval = 500L;
  
  private long mLastClickTime;
  
  private int mLastClickViewId;

  public NoShakeClickListener() {
  }

  public NoShakeClickListener(long interval) {
    this.mTimeInterval = interval;
  }

  @Override
  public void onClick(View v) {
    final boolean isFastClick = isFastDoubleClick(v, this.mTimeInterval);
    if (isFastClick) {
      onFastClick(v);
    } else {
      onSingleClick(v);
    }
  }

  
  private boolean isFastDoubleClick(View v, long interval) {
    int viewId = v.getId();
    long nowTime = System.currentTimeMillis();
    long timeInterval = Math.abs(nowTime - mLastClickTime);
    if (timeInterval < interval && viewId == mLastClickViewId) {
      // 快速点击事件
      return true;
    } else {
      // 单次点击事件
      mLastClickTime = nowTime;
      mLastClickViewId = viewId;
      return false;
    }
  }
  
  protected void onFastClick(View v) {}
  protected abstract void onSingleClick(View v);
}

可简写为


public abstract class NoShakeListener implements OnClickListener {
  private long mLastClickTime = 0;
  private boolean isFastDoubleClick() {
    long nowTime = System.currentTimeMillis();
    if (Math.abs(nowTime - mLastClickTime) < 500) {
      return true; // 快速点击事件
    } else {
      mLastClickTime = nowTime;
      return false; // 单次点击事件
    }
  }
  @Override
  public void onClick(View v) {
    if (isFastDoubleClick()) {
      onFastClick(v);
    } else {
      onSingleClick(v);
    }
  }
  protected void onFastClick(View v) {
  }
  protected abstract void onSingleClick(View v);
}

Kotlin版本


abstract class NoShakeClickListener @JVMOverloads constructor(interval: Long = 500L) : View.OnClickListener {

  private var mTimeInterval = 500L
  private var mLastClickTime: Long = 0  //最近一次点击的时间
  private var mLastClickViewId = 0    //最近一次点击的控件ID

  init {
    mTimeInterval = interval
  }

  override fun onClick(v: View) {
    if (isFastDoubleClick(v, mTimeInterval)) onFastClick(v) else onSingleClick(v)
  }

  
  private fun isFastDoubleClick(v: View, interval: Long): Boolean {
    val viewId = v.id
    val nowTime = System.currentTimeMillis()
    val timeInterval = abs(nowTime - mLastClickTime)
    return if (timeInterval < interval && viewId == mLastClickViewId) {
      // 快速点击事件
      true
    } else {
      // 单次点击事件
      mLastClickTime = nowTime
      mLastClickViewId = viewId
      false
    }
  }

  protected open fun onFastClick(v: View?) {}
  protected abstract fun onSingleClick(v: View?)
}

差点忘了... 相应的扩展函数:


fun View?.noShake(block: (v: View?) -> Unit) {
  this?.apply {
    setOnClickListener(object : NoShakeClickListener() {
      override fun onSingleClick(v: View?) {
        block.invoke(v)
      }
    })
  }
}

RxJava2 clickExt.kt


inline fun <T : View> T.noShake(crossinline listener: T.() -> Unit) = this.noShake(1000, listener)

inline fun <T : View> T.noShake(windowDuration: Long = 500, crossinline listener : T.() -> Unit) =
  RxView.clicks(this)
    .throttleFirst(windowDuration, TimeUnit.MILLISECONDS)
    .subscribe(object : Observer<Any> {
      override fun onSubscribe(d: Disposable) {}
      override fun onError(e: Throwable) {}
      override fun onComplete() {}
      override fun onNext(o: Any) {
        listener()
      }
    })

无侵入式防抖处理(NoShakeClickListener2)

特点:

1 移除了对View.OnClickListener的依赖, 在不破坏原有代码已设置好的OnClickListener基础上继续处理事件防抖;

2 支持简单处理事件和泛型回调



open class NoShakeClickListener2 @JvmOverloads constructor(interval: Long = 500L) {

  private var mTimeInterval = 500L
  private var mLastClickTime: Long = 0  //最近一次点击的时间
  private var mLastClick: Any? = null  //最近一次点击的控件 View or MenuItem ...

  init {
    mTimeInterval = interval
  }

  fun proceedClick() {
    if (isFastClick(null, mTimeInterval)) onFastClick(null) else onSingleClick(null)
  }

  fun <T> proceedClick(item: T?) {
    if (isFastClick(item, mTimeInterval)) onFastClick(item) else onSingleClick(item)
  }

  
  private fun <T> isFastClick(item: T?, interval: Long): Boolean {
    val nowTime = System.currentTimeMillis()
    val timeInterval = abs(nowTime - mLastClickTime)
    return if (timeInterval < interval && item == mLastClick) {
      // 快速点击事件
      true
    } else {
      // 单次点击事件
      mLastClickTime = nowTime
      mLastClick = item
      false
    }
  }

  protected open fun onFastClick(item: Any?) {}
  protected open fun onSingleClick(item: Any?) {}
}

实用案例

1 简单使用


//快速点击事件
val fastClick=object :NoShakeClickListener2(){
  override fun onFastClick(item: Any?) {
    super.onFastClick(item)
    //此时 item == null
    Log.e("123", "onFastClick Click")
  }
}
BottomNavigationView.setOnNavigationItemSelectedListener {
  switchPage(it.itemId)
  fastClick.proceedClick()
  true
}

2 回传参数


//快速点击事件
val fastClick=object :NoShakeClickListener2(){
  override fun onFastClick(item: Any?) {
    super.onFastClick(item)
    //此时 item == null 为 proceedClick(it) 中的 it
    Log.e("123", "onFastClick Click")
  }
}
BottomNavigationView.setOnNavigationItemSelectedListener {
  switchPage(it.itemId)
  fastClick.proceedClick(it)
  true
}

以上就是Android View 事件防抖的两种方案的详细内容,更多关于Android View 事件防抖的资料请关注编程网其它相关文章!

--结束END--

本文标题: Android View 事件防抖的两种方案

本文链接: https://www.lsjlt.com/news/122777.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android View 事件防抖的两种方案
    目录两种方案侵入式防抖处理(NoShakeClickListener)Java 版本Kotlin版本RxJava2 clickExt.kt无侵入式防抖处理(NoShakeClickL...
    99+
    2024-04-02
  • Android中View事件防抖的处理方案
    这篇文章主要介绍了Android中View事件防抖的处理方案,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。两种方案侵入式防抖处理(NoShakeClickListener) ...
    99+
    2023-06-14
  • Android事件处理的两种方式详解
    安卓提供了两种方式的事件处理:基于回调的事件处理和基于监听的事件处理。 基于监听的事件处理 基于监听的事件处理一般包含三个要素,分别是: Event Source(事件源):事件发生...
    99+
    2023-02-28
    Android事件处理 Android事件处理机制 Android事件处理流程
  • Android事件处理的两种方式是什么
    这篇文章主要讲解了“Android事件处理的两种方式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android事件处理的两种方式是什么”吧!安卓提供了两种方式的事件处理:基于回调的事...
    99+
    2023-07-05
  • Android 手机防止休眠的两种实现方法
    Android 手机防止休眠的两种实现方法实现这一功能的方法有两种, 一种是在Manifest.xml文件里面声明。 一种是在代码里面修改LayoutParams的标志位。具体如下:   1、在Manifest.xml文件里面用user-p...
    99+
    2023-05-30
    android 防止休眠 roi
  • 基于Android在布局中动态添加view的两种方法(总结)
    一、说明 添加视图文件的时候有两种方式:1、通过在xml文件定义layout;2、java代码编写二、前言说明1.构造xml文件2.LayoutInflater提到addview,首先要了解一下LayoutInflater类。这个类最主要的...
    99+
    2023-05-30
    android 动态添加 view
  • Android中button的onClick事件几种方法
    Android中button的onClick事件几种方法利用三种方法,学习button的监听事件。方法一源码如下:package com.example.androidtest; import android.os.Bundle; imp...
    99+
    2023-05-30
    android button onclick
  • Android实现View滑动的6种方式
    本文实例为大家分享了Android实现View滑动的具体方法,供大家参考,具体内容如下1.View的滑动简介View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理。其实不管是那种滑动的方式基本思...
    99+
    2023-05-31
    android view 滑动
  • Android彻底清除APP数据的两种方案总结
    目录用途方案一:利用命令行pm clear 包名,系统级别清除App数据优点缺点代码方案二:手动删除内部储存和外部储存优点缺点代码总结用途 用于APP内部的重置功能实现。 方案一:...
    99+
    2024-04-02
  • Android View的事件体系教程详解
    目录一、什么是View?什么是ViewGroup?二、View的位置三、View的触摸事件1.MotionEvent2.TouchSlop3.VelocityTracker5.Scr...
    99+
    2024-04-02
  • Android View的事件体系实例分析
    这篇“Android View的事件体系实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android&nb...
    99+
    2023-06-29
  • Android TextView对齐的两种方法
    Android TextView对齐的两种方法 在写Android布局文件时, 经常碰到如下图的TextView左右对齐的情况, 即姓名和手机号码纵向对齐。、  第一种方法:  在姓和名之间加空格, ...
    99+
    2023-05-30
    android textview 对齐
  • Android实现旋转动画的两种方式案例详解
    目录练习案例效果展示前期准备自定义 View java代码编写方法一方法二易错点总结:练习案例 视差动画 - 雅虎新闻摘要加载 效果展示 前期准备 第一步:准备好颜色数组 res ...
    99+
    2024-04-02
  • 详解pygame捕获键盘事件的两种方式
    方式1:在pygame中使用pygame.event.get()方法捕获键盘事件,使用这个方式捕获的键盘事件必须要是按下再弹起才算一次。 示例示例: for event in p...
    99+
    2024-04-02
  • Android Studio 导入framework.jar的两种方式
    第一种:把framework的jar包放到工程目录外 把framework.jar包放到当前工程以外的地方。例如我放到SDK目录下。如下图  2、在项目根目录的gradle中引入jar包 String SDK_DIR = System.g...
    99+
    2023-10-03
    android studio android jar
  • Android Button点击事件的四种实现方法
    Android中Button四种点击事件实现方式,具体内容如下Xml添加监听属性,这里添加的doClick。<Button android:id="@+id/bt1" android:layout_width="wrap_...
    99+
    2023-05-30
    android button 点击事件
  • Thinkphp事件机制两种实现方式详解
    目录一、通过监听二、通过订阅1、创建订阅类2、配置监听3、触发监听4、处理监听逻辑4.1 自动绑定4.2 手动绑定总结事件机制的实现有两种途径:通过监听、通过订阅 一、通过监听 1、...
    99+
    2024-04-02
  • Android实现View滑动效果的6种方法
    本文实例为大家分享了Android实现View滑动效果的具体代码,供大家参考,具体内容如下 一、View的滑动简介 View的滑动是Android实现自定义控件的基础,同时在开发中我...
    99+
    2024-04-02
  • Android响应事件onClick方法的四种实现方式
    在Android的开发中,对于点击事件的OnClickListener有下面四种实现方式,可以根据实际场景的需要选择合适的用法。下面以Button按钮来举例说明。 方法一:匿名内部类 适合场景:任...
    99+
    2023-10-07
    android
  • Android 获得View宽高的几种方式总结
    《Android开发艺术探索》笔记:在Activity的onCreate()或者onResume()中去获得View的高度的时候不能正确获得宽度和高度信息,这是因为 View的measure过程和Activity的生命周期不是同步执行的,因...
    99+
    2023-05-31
    android view roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作