我在 Android Studio、Kotlin 中制作计算器。我希望在交换期间按下数学运算符按钮,但它们不起作用
在MainActivity.kt中:
private lateinit var lSwipeDetector: GestureDetectorCompat
private lateinit var mainLayout: LinearLayout
private var lastX: Float = 0.0f
private var lastY: Float = 0.0f
private var lastZ: Float = 0.0f
companion object {
private const val SWIPE_MIN_DISTANCE = 130
private const val SWIPE_MAX_DISTANCE = 300
private const val SWIPE_MIN_VELOCITY = 200
}
在onCreate fun中:
mainLayout = findViewById(R.id.main_layout)
lSwipeDetector = GestureDetectorCompat(this, MyGestureListener())
mainLayout.setOnTouchListener { _, event ->
lSwipeDetector.onTouchEvent(event)
true
}
然后我在MainActivity中为gesters进程创建了内部类
inner class MyGestureListener : GestureDetector.SimpleOnGestureListener() {
override fun onDown(e: MotionEvent): Boolean {
return true
}
override fun onFling(
e1: MotionEvent?,
e2: MotionEvent,
velocityX: Float,
velocityY: Float
): Boolean {
val deltaX = e2.x - e1!!.x
val deltaY = e2.y - e1.y
val deltaXAbs = abs(deltaX)
val deltaYAbs = abs(deltaY)
if (deltaXAbs > SWIPE_MIN_DISTANCE && abs(velocityX) > SWIPE_MIN_VELOCITY) {
if (deltaX > 0) {
bPlus.performClick()
//Toast.makeText(this@MainActivity, "Swipe Right", Toast.LENGTH_SHORT).show()
} else {
bMin.performClick()
//Toast.makeText(this@MainActivity, "Swipe Left", Toast.LENGTH_SHORT).show()
}
return true
}
if (deltaYAbs > SWIPE_MIN_DISTANCE && abs(velocityY) > SWIPE_MIN_VELOCITY) {
if (deltaY > 0) {
bDiv.performClick()
//Toast.makeText(this@MainActivity, "Swipe Down", Toast.LENGTH_SHORT).show()
} else {
bMul.performClick()
//Toast.makeText(this@MainActivity, "Swipe Up", Toast.LENGTH_SHORT).show()
}
return true
}
return false
}
}
我的活动_主要:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="10"
android:background="@drawable/background"
tools:context=".MainActivity">
...
从调试来看,交换不涉及 MyGestureListener 类,甚至不涉及 mainLayout
活动类中缺少 onTouchEvent 方法
class MainActivity: AppCompatActivity(), GestureDetector.OnGestureListener {
private lateinit var gestureDetector: GestureDetectorCompat
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
gestureDetector = GestureDetectorCompat(this, this)
}
override fun onTouchEvent(event: MotionEvent): Boolean {
gestureDetector.onTouchEvent(event)
return super.onTouchEvent(event)
}
override fun onDown(e: MotionEvent): Boolean {
return true
}
override fun onShowPress(e: MotionEvent) {
}
override fun onSingleTapUp(e: MotionEvent): Boolean {
return true
}
override fun onScroll(
e1: MotionEvent?,
e2: MotionEvent,
distanceX: Float,
distanceY: Float,
): Boolean {
return true
}
override fun onLongPress(e: MotionEvent) {
}
override fun onFling(
maine1: MotionEvent?,
e2: MotionEvent,
velocityX: Float,
velocityY: Float,
): Boolean {
maine1?.let { e1 ->
val diffX = e2.x - e1.x
val diffY = e2.y - e1.y
if (abs(diffX) > abs(diffY)) {
if (abs(diffX) > SWIPE_THRESHOLD && abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
Toast.makeText(this@MainActivity, "Swipe Right", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this@MainActivity, "Swipe Left", Toast.LENGTH_SHORT).show()
}
return true
}
} else {
if (abs(diffY) > SWIPE_THRESHOLD && abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
Toast.makeText(this@MainActivity, "Swipe Down", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this@MainActivity, "Swipe Up", Toast.LENGTH_SHORT).show()
}
return true
}
}
}
return false
}
}