• 利用Kotlin扩展函数实现任意View的点击处理(点击效果和防止快速点击)


    利用Kotlin扩展函数实现View的点击处理(点击效果和防止快速点击)

    kotlin经典写法:

            view?.setOnClickListener { 
                //实现
            }

    项目实践证明,这种写法存在问题

    例如:项目中有支付功能,发起支付时会向后台提交数据,如果此时用户手抖(狗头)就会多次提交,可能创建了2个订单

    优化抖动写法:

    val minTime = 500L//这是间隔多少毫秒
    var lastTime = 0L
    val tmpTime = System.currentTimeMillis()
            if (tmpTime - lastTime > minTime) {
                lastTime = tmpTime
                listener.invoke(this)
            } else {
                LogZ.d("点击过快,取消触发")
            }

    再写成kotlin扩展函数ext.kt:

    /***
     * 防止快速点击
     */
    fun View.click(listener: (view: View) -> Unit) {
        val minTime = 500L
        var lastTime = 0L
        this.setOnClickListener {
            val tmpTime = System.currentTimeMillis()
            if (tmpTime - lastTime > minTime) {
                lastTime = tmpTime
                listener.invoke(this)
            } else {
                LogZ.d("点击过快,取消触发")
            }
        }
    }

    以上是处理点击抖动

    仔细一看,这里可以拿到View对象,既然这样,我们可以尝试在View点击事件中加点东西

    项目中,一般可以点击的地方都需要点击效果(置灰改变透明度等),常规写法是写Drawable文件,然后android:background="xxxx"

    但是这种写法很繁琐,每个不同类型控件都需要写Drawable然后xml里写android:background="xxxx",针对不同类型控件处理方法也不一样,例如:TextView,ImageView,ViewGroup等等

    下面可以简单实现防止点击抖动+点击效果(改变alpha只是一种方式,可以自己实现更炫酷的效果)

    增加点击效果ext.kt

    /***
     * 防止快速点击-并且添加按下变暗效果
     */
    fun View.click(listener: (view: View) -> Unit) {
        val minTime = 500L
        var lastTime = 0L
        this.setOnClickListener {
            val tmpTime = System.currentTimeMillis()
            if (tmpTime - lastTime > minTime) {
                lastTime = tmpTime
                listener.invoke(this)
            } else {
                LogZ.d("点击过快,取消触发")
            }
        }
        this.setOnTouchListener { view, motionEvent ->
            if (motionEvent.action == MotionEvent.ACTION_DOWN) {
                view.alpha = 0.7f//这里改变前,可以存储原view.alpha值,这样不会影响设置了alpha的view
                Log.d("点击----","ACTION_DOWN")
            } else if (motionEvent.action == MotionEvent.ACTION_UP) {
                view.alpha = 1f//存储了alpha,取出值
                Log.d("点击----","ACTION_UP")
            } else if (motionEvent.action == MotionEvent.ACTION_CANCEL) {
                view.alpha = 1f
                Log.d("点击----","ACTION_CANCEL")
            }
            return@setOnTouchListener false
        }
    }

    使用扩展函数:

    view.click {
      //点击事件 }

    :)

  • 相关阅读:
    使用OPATCH_DEBUG环境变量调试Opatch工具
    ORACLE or Oracle?
    Precheck while you are applying oneoff patch
    SHMALL, SHMMAX and SGA sizing
    解决UDE31623错误一例
    Postgre SQL 9.1 beta:开源世界的礼物
    How does SGA/PGA allocate on AMM?
    /dev/shm Filled Up With Files In Format JOXSHM_EXT_xxx_SID_xxx
    解决ORA27103:internal error错误一例
    headfirst java ( 第 10 章 )
  • 原文地址:https://www.cnblogs.com/zh2314372037/p/13965371.html
Copyright © 2020-2023  润新知