1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
| package com.example.myapplication.touchevent
var sEventTime = 0L var sEventHandlerSeq = 0
private fun trackEvent(e: MotionEvent?): String { if (sEventTime == 0L || sEventTime != e?.eventTime) { sEventTime = e?.eventTime ?: 0 sEventHandlerSeq = 0 } else { sEventHandlerSeq++ } return "#$sEventHandlerSeq" }
object TeViewTouchListener : OnTouchListener { override fun onTouch(v: View?, event: MotionEvent?): Boolean { Timber.i("%s eventHandlerSeq = %s", object {}.javaClass.enclosingMethod?.name, trackEvent(event)) return false }
}
class TeView(context: Context, attributeSet: AttributeSet? = null) : androidx.appcompat.widget.AppCompatTextView(context, attributeSet) {
val isBtn = Button::class.java.isInstance(this)
override fun dispatchTouchEvent(event: MotionEvent?): Boolean { val me = if (isBtn) { "I'm a button" } else { "I'm NOT a button" } Timber.i( "%s %s eventHandlerSeq = %s", me, object {}.javaClass.enclosingMethod?.name, trackEvent(event) ) return super.dispatchTouchEvent(event) }
override fun onTouchEvent(event: MotionEvent?): Boolean { val me = if (isBtn) { "I'm a button" } else { "I'm NOT a button" } Timber.i( "%s %s eventHandlerSeq = %s", me, object {}.javaClass.enclosingMethod?.name, trackEvent(event) ) return super.onTouchEvent(event) }
}
class TeViewGroupB(context: Context, attributeSet: AttributeSet? = null) : FrameLayout(context, attributeSet) { override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { Timber.i("%s eventHandlerSeq = %s", object {}.javaClass.enclosingMethod?.name, trackEvent(ev)) return super.dispatchTouchEvent(ev) }
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { Timber.i("%s eventHandlerSeq = %s", object {}.javaClass.enclosingMethod?.name, trackEvent(ev)) return super.onInterceptTouchEvent(ev) }
override fun onTouchEvent(event: MotionEvent?): Boolean { Timber.i("%s eventHandlerSeq = %s", object {}.javaClass.enclosingMethod?.name, trackEvent(event)) return super.onTouchEvent(event) } }
class TeViewGroupA(context: Context, attributeSet: AttributeSet? = null) : FrameLayout(context, attributeSet) { override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { Timber.i("%s eventHandlerSeq = %s", object {}.javaClass.enclosingMethod?.name, trackEvent(ev)) return super.dispatchTouchEvent(ev) }
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { Timber.i("%s eventHandlerSeq = %s", object {}.javaClass.enclosingMethod?.name, trackEvent(ev)) return super.onInterceptTouchEvent(ev) }
override fun onTouchEvent(event: MotionEvent?): Boolean { Timber.i("%s eventHandlerSeq = %s", object {}.javaClass.enclosingMethod?.name, trackEvent(event)) return super.onTouchEvent(event) } }
class TeActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val vga = TeViewGroupA(this) val vgb = TeViewGroupB(this) val v = TeView(this).apply { text = "click me" }
vgb.addView(v) vga.addView(vgb) setContentView(vga)
}
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { Timber.i("%s eventHandlerSeq = %s", object {}.javaClass.enclosingMethod?.name, trackEvent(ev)) return super.dispatchTouchEvent(ev) }
override fun onTouchEvent(event: MotionEvent?): Boolean { Timber.i("%s eventHandlerSeq = %s", object {}.javaClass.enclosingMethod?.name, trackEvent(event)) return super.onTouchEvent(event) }
companion object { @JvmStatic fun start(context: Context) { val starter = Intent(context, TeActivity::class.java) context.startActivity(starter) } } }
|