Android kotlin使用註解實現防按鈕連點功能的示例
SingleClick:
@Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.FUNCTION) annotation class SingleClick( // 點擊間隔時間,毫秒 val value: Long = 500 )
SingleClickAspect:
import android.os.SystemClock import org.aspectj.lang.ProceedingJoinPoint import org.aspectj.lang.annotation.Around import org.aspectj.lang.annotation.Aspect import org.aspectj.lang.annotation.Pointcut import org.aspectj.lang.reflect.MethodSignature @Aspect class SingleClickAspect { /** * 定義切點,標記切點為所有被@SingleClick註解的方法 * 註意:這裡 你的包名.SingleClick 需要替換成 * 你自己項目中SingleClick這個類的全路徑 */ @Pointcut("execution(@你的包名.SingleClick * *(..))") fun methodAnnotated() { } /** * 定義一個切面方法,包裹切點方法 */ @Around("methodAnnotated()") @Throws(Throwable::class) fun aroundJoinPoint(joinPoint: ProceedingJoinPoint) { try { // 取出方法的註解 val signature = joinPoint.signature as MethodSignature val method = signature.method // 檢查方法是否有註解 val hasAnnotation = method != null && method.isAnnotationPresent(SingleClick::class.java) if (hasAnnotation) { // 計算點擊間隔,沒有註解默認500,有註解按註解參數來,註解參數為空默認500; val singleClick = method.getAnnotation(SingleClick::class.java) val interval = singleClick.value // 檢測間隔時間是否達到預設時間並且線程空閑 if (canClick(interval)) { joinPoint.proceed() } } else { joinPoint.proceed() } } catch (e: Exception) { // 出現異常不攔截點擊事件 joinPoint.proceed() } } // 判斷是否響應點擊 private fun canClick(interval: Long): Boolean { val time = SystemClock.elapsedRealtime() val timeInterval = Math.abs(time - mLastClickTime) if (timeInterval > interval) { mLastClickTime = time return true } return false } companion object { // 最後一次點擊的時間 private var mLastClickTime: Long = 0 } }
build.gradle(項目):
buildscript { dependencies { classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4' } }
build.gradle(APP):
plugins { id 'android-aspectjx' }
使用:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:onClick="onTextClick" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } @SingleClick(800) fun onTextClick(view: View) { } }
以上就是Android kotlin使用註解實現防按鈕連點功能的示例的詳細內容,更多關於Android kotlin實現防按鈕連點功能的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Android 詳解沉浸式狀態欄的實現流程
- Android移動應用開發指南之六種佈局詳解
- android實現簡單底部導航欄
- android 實現側邊彈窗特效代碼
- Android AS創建自定義佈局案例詳解