Android 防抖点击

Kotlin View扩展类 除了防抖还有一些其他的功能

inline fun  T.afterMeasured(crossinline f: T.() -> Unit) {
    viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            if (measuredWidth > 0 && measuredHeight > 0) {
                viewTreeObserver.removeOnGlobalLayoutListener(this)
                f()
            }
        }
    })
}

/**
 * 点击防抖动
 */
fun View.clickDebounced(
    time: Long = 1000L,
    action: (View) -> Unit
) {
    setOnClickListener(object : DebounceClickListener(time) {
        override fun onDebounceClick(v: View) {
            action(v)
        }
    })
}

private abstract class DebounceClickListener(private val interval: Long) :
    View.OnClickListener {
    private var mLastClickTime: Long = 0

    override fun onClick(v: View) {
        val nowTime = SystemClock.elapsedRealtime()
        if (Math.abs(nowTime - mLastClickTime) >= interval) { // 单次点击事件
            mLastClickTime = nowTime
            onDebounceClick(v)
        }
    }

    protected abstract fun onDebounceClick(v: View)

    /**
     * 生成某个view的截图
     */
    fun View.screenCapture(window: Window, view: View, block: (Bitmap?) -> Unit) {
        val bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888)
        val rect = Rect()
        rect.set(0, 0, view.width, view.height)
        PixelCopy.request(window, rect, bitmap, { copyResult ->
            if (copyResult == PixelCopy.SUCCESS) {
                block.invoke(bitmap)
            } else {
                block.invoke(null)
            }
        }, Handler(Looper.getMainLooper()))
    }
}

项目中使用

view.clickDebounced(time 自定义防抖点击时间){
// 点击回调
}

你可能感兴趣的:(android)