试图设置一个抽象的监听器
Trying to set an Listener which is abstracted
我现在正在开发一个小应用程序来测试周围的运动和触摸事件。我面临的问题是我的 Listener class 必须被抽象化,但我无法从该 listener 创建一个对象,我需要将它放在 imageView 的 "setOnTouchListener" 方法上。
听众class:
abstract class GestureListener(directionDisplayer: TextView) : View.OnTouchListener,` GestureDetector.OnGestureListener {
private var directionDisplayer: TextView = directionDisplayer
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
val gestureDetector = GestureDetector(this)
gestureDetector.onTouchEvent(event)
return true
}
override fun onFling(
downEvent: MotionEvent?,
moveEvent: MotionEvent?,
velocityX: Float,
velocityY: Float
): Boolean {
var result = false
if (downEvent != null && moveEvent != null) {
var diffY: Float = moveEvent.y - downEvent.y
var diffX: Float = moveEvent.x - downEvent.x
val SWIPE_MIN = 100
val SWIPE_Velocity = 100 //TODO WIDTH
if (Math.abs(diffX) > Math.abs(diffY)) {
//RIGHT OR LEFT
if (Math.abs(diffX) > SWIPE_MIN && Math.abs(velocityX) > SWIPE_Velocity) {
if (diffX > 0) {
swipeRight()
} else {
swipeLeft()
}
result = true
}
} else {
//UP OR DOWN
if(Math.abs(diffY) > SWIPE_MIN && Math.abs(velocityY) > SWIPE_Velocity) {
if(diffY > 0) {
swipeUp()
} else {
swipeDown()
}
result = true
}
}
}
return result
}
private fun swipeDown() {
directionDisplayer.text = "Direction: DOWN"
}
private fun swipeUp() {
directionDisplayer.text = "Direction: UP"
}
private fun swipeLeft() {
directionDisplayer.text = "Direction: LEFT"
}
private fun swipeRight() {
directionDisplayer.text = "Direction: RIGHT"
}
MainActivity (only the important):
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestWindowFeature(Window.FEATURE_NO_TITLE)
window.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN
)
setContentView(R.layout.activity_main)
val canvasImage: ImageView = findViewById(R.id.canvas)
canvasImage.setOnTouchListener(GestureListener(findViewById(R.id.showDirection)))
有人知道如何解决这个问题吗?
GestureListener
是一个摘要 class。因此,您必须实现 iew.OnTouchListener
和 GestureDetector.OnGestureListener
的成员,这些成员尚未在摘要 class 本身或您的代码中实现,例如 -
canvasImage.setOnTouchListener(object : GestureListener(textView) {
override fun onShowPress(e: MotionEvent?) {
TODO("not implemented")
}
override fun onSingleTapUp(e: MotionEvent?): Boolean {
TODO("not implemented")
}
override fun onDown(e: MotionEvent?): Boolean {
TODO("not implemented")
}
override fun onScroll(
e1: MotionEvent?,
e2: MotionEvent?,
distanceX: Float,
distanceY: Float
): Boolean {
TODO("not implemented")
}
override fun onLongPress(e: MotionEvent?) {
TODO("not implemented")
}
})
我现在正在开发一个小应用程序来测试周围的运动和触摸事件。我面临的问题是我的 Listener class 必须被抽象化,但我无法从该 listener 创建一个对象,我需要将它放在 imageView 的 "setOnTouchListener" 方法上。
听众class:
abstract class GestureListener(directionDisplayer: TextView) : View.OnTouchListener,` GestureDetector.OnGestureListener {
private var directionDisplayer: TextView = directionDisplayer
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
val gestureDetector = GestureDetector(this)
gestureDetector.onTouchEvent(event)
return true
}
override fun onFling(
downEvent: MotionEvent?,
moveEvent: MotionEvent?,
velocityX: Float,
velocityY: Float
): Boolean {
var result = false
if (downEvent != null && moveEvent != null) {
var diffY: Float = moveEvent.y - downEvent.y
var diffX: Float = moveEvent.x - downEvent.x
val SWIPE_MIN = 100
val SWIPE_Velocity = 100 //TODO WIDTH
if (Math.abs(diffX) > Math.abs(diffY)) {
//RIGHT OR LEFT
if (Math.abs(diffX) > SWIPE_MIN && Math.abs(velocityX) > SWIPE_Velocity) {
if (diffX > 0) {
swipeRight()
} else {
swipeLeft()
}
result = true
}
} else {
//UP OR DOWN
if(Math.abs(diffY) > SWIPE_MIN && Math.abs(velocityY) > SWIPE_Velocity) {
if(diffY > 0) {
swipeUp()
} else {
swipeDown()
}
result = true
}
}
}
return result
}
private fun swipeDown() {
directionDisplayer.text = "Direction: DOWN"
}
private fun swipeUp() {
directionDisplayer.text = "Direction: UP"
}
private fun swipeLeft() {
directionDisplayer.text = "Direction: LEFT"
}
private fun swipeRight() {
directionDisplayer.text = "Direction: RIGHT"
}
MainActivity (only the important):
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestWindowFeature(Window.FEATURE_NO_TITLE)
window.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN
)
setContentView(R.layout.activity_main)
val canvasImage: ImageView = findViewById(R.id.canvas)
canvasImage.setOnTouchListener(GestureListener(findViewById(R.id.showDirection)))
有人知道如何解决这个问题吗?
GestureListener
是一个摘要 class。因此,您必须实现 iew.OnTouchListener
和 GestureDetector.OnGestureListener
的成员,这些成员尚未在摘要 class 本身或您的代码中实现,例如 -
canvasImage.setOnTouchListener(object : GestureListener(textView) {
override fun onShowPress(e: MotionEvent?) {
TODO("not implemented")
}
override fun onSingleTapUp(e: MotionEvent?): Boolean {
TODO("not implemented")
}
override fun onDown(e: MotionEvent?): Boolean {
TODO("not implemented")
}
override fun onScroll(
e1: MotionEvent?,
e2: MotionEvent?,
distanceX: Float,
distanceY: Float
): Boolean {
TODO("not implemented")
}
override fun onLongPress(e: MotionEvent?) {
TODO("not implemented")
}
})