Android_这点事_去除按键抖动

为View增加抖动过滤的扩展函数

在开发过程中,我们在相应View的点击事件的时候会出现连续两次点击的情况,从而使响应的处理两次甚至多次,为此我们需要为View做一个连续两次点击的过滤操作,代码用Kotlin开发,作为View的扩展方法,代码如下

//设置当前时间
const val TAG_LAST_TIME = 999999999
private var <T : View> T.triggerLastTime: Long
    get():Long {
        if (getTag( TAG_LAST_TIME) != null) {
            return getTag(TAG_LAST_TIME) as Long
        }
        return 0L

    }
    set(value) {
        setTag(TAG_LAST_TIME, value)
    }
//设置延时时间
const val TAG_TRIGGER_DELAY = 888888888
private var <T : View> T.triggerDelay: Long
    get():Long{
        if (getTag(TAG_TRIGGER_DELAY) != null){
            return getTag(TAG_TRIGGER_DELAY) as Long
        }
        return 0L
    }
    set(value) {
        setTag(TAG_TRIGGER_DELAY, value)
    }
//判断是否在抖动时间
private fun <T : View> T.clickEnable(): Boolean {
    var flag = false
    val currentClickTime = System.currentTimeMillis()
    if (currentClickTime - triggerLastTime >= triggerDelay) {
        flag = true
    }
    triggerLastTime = currentClickTime
    return flag
}

//-----延时点击--End-----

过滤第三方View中的抖动点击事件

在开发过程中,有时候我们会引用一些第三方的View组件,我们无法修改相关的代码,为此需要制作出一个通用的过滤快速点击的一些方法。其代码如下(作为Context)的扩展函数

var mClickTime = 0L
fun Context.checkDoubleStart(default:Int=800):Boolean{
    var result = true
    val curTiem = SystemClock.uptimeMillis()
    if (mClickTime + default <= curTiem) {
        // 检查不通过
        result = false
    }
    mClickTime = curTiem
    return result
}
Android中,可以使用属性动画来实现抖动动画吸引用户的注意力。以下是一个简单的示例代码: ```java // 获取需要抖动的视图 View view = findViewById(R.id.my_view); // 定义抖动动画 ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotation", -5, 5); animator.setDuration(100); animator.setRepeatCount(5); animator.setRepeatMode(ObjectAnimator.REVERSE); // 开始动画 animator.start(); ``` 这个代码会使得视图向左旋转5度,然后向右旋转5度,重复执行5次,每次执行时间为100毫秒。通过这个抖动动画,可以吸引用户的注意力。 如果想要实现中心点旋转的效果,可以在抖动动画的基础上加入平移动画,使得视图围绕中心点旋转。以下是一个修改后的示例代码: ```java // 获取需要旋转的视图 View view = findViewById(R.id.my_view); // 获取视图的中心点坐标 int cx = view.getWidth() / 2; int cy = view.getHeight() / 2; // 定义旋转动画 ObjectAnimator rotation = ObjectAnimator.ofFloat(view, "rotation", 0, 360); rotation.setDuration(2000); rotation.setInterpolator(new LinearInterpolator()); rotation.setRepeatCount(ObjectAnimator.INFINITE); // 定义平移动画 ObjectAnimator translationX = ObjectAnimator.ofFloat(view, "translationX", 0, cx); translationX.setDuration(1000); translationX.setRepeatCount(1); translationX.setRepeatMode(ObjectAnimator.REVERSE); // 合并动画 AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether(rotation, translationX); // 开始动画 animatorSet.start(); ``` 这个代码会使得视图围绕中心点旋转,并且在动画过程中会进行一次平移,使得视图的中心点在旋转过程中保持不变。通过这个中心点旋转的效果,可以吸引用户的注意力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值