overridefunonTouchEvent(event: MotionEvent): Boolean { when (event.action) { MotionEvent.ACTION_DOWN -> { downX = event.rawX downY = event.rawY } MotionEvent.ACTION_UP -> { val dx = event.rawX - downX val dy = event.rawY - downY if (kotlin.math.sqrt(dx * dx + dy * dy) < touchSlop) { // 判定为点击 findAndTrackTarget(event) } } } returnfalse// 返回 false,事件继续向下分发 }
privatefunfindAndTrackTarget(event: MotionEvent) { // 向上查找根布局 var root = parent as? ViewGroup ?: return while (root.parent is ViewGroup) { root = root.parent as ViewGroup }
val target = findDeepestView(root, event.rawX.toInt(), event.rawY.toInt()) target?.let { AnalyticsSDK.track("app_click", mapOf( "class" to it.javaClass.name, "id" to it.id, "text" to ((it as? TextView)?.text?.toString() ?: "") )) } }
privatefunfindDeepestView(parent: ViewGroup, x: Int, y: Int): View? { for (i in parent.childCount - 1 downTo 0) { val child = parent.getChildAt(i) if (child.visibility != View.VISIBLE) continue val loc = IntArray(2) child.getLocationOnScreen(loc) if (x in loc[0]..(loc[0] + child.width) && y in loc[1]..(loc[1] + child.height)) { if (child is ViewGroup) { return findDeepestView(child, x, y) ?: child } return child } } return parent } }
三、自动添加透明层
classTrackingLifecycleCallbacks : Application.ActivityLifecycleCallbacks { overridefunonActivityCreated(activity: Activity, savedInstanceState: Bundle?) { val decorView = activity.window.decorView as ViewGroup val overlay = TrackingOverlay(activity)