I'm working right now on an little app to test arround with motion and touch events. I am facing the problem that my Listener class has to be abstracted but I cannot create an object from that listener which I would need to put it on the "setOnTouchListener" method of an imageView.
Listener 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)))
Does anybody have an idea how to fix this?
GestureListener
is an abstract class. So, you have to implement the members of iew.OnTouchListener
and GestureDetector.OnGestureListener
not yet implemented either in the abstract class itself or in your code like this-
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")
}
})