如何在安卓系统中检测刷卡方向?
检测手势是许多应用程序开发人员关注的一个非常重要的功能。执行某些动作可能需要许多手势。例如,用户可能需要从左向右滑动屏幕来解锁屏幕。同样,可能需要反过来。在这种情况下,有必要检测用户所做的滑动或手势的方向。类似地,大多数游戏应用程序严重依赖用户手势来执行期望的动作。因此,通过这篇文章,我们将向您展示如何在屏幕上检测用户输入的滑动方向。
逐步实施
第一步:在安卓工作室新建项目
要在安卓工作室创建新项目,请参考如何在安卓工作室创建/启动新项目。我们在 Kotlin 中演示了该应用程序,因此在创建新项目时,请确保选择 Kotlin 作为主要语言。
第二步:在主代码(MainActivity.kt) 中添加这个
为了更好的理解,请参考代码内部的注释。
我的锅
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.GestureDetector
import android.view.MotionEvent
import android.widget.Toast
import kotlin.math.abs
class MainActivity : AppCompatActivity(), GestureDetector.OnGestureListener {
// Declaring gesture detector, swipe threshold, and swipe velocity threshold
private lateinit var gestureDetector: GestureDetector
private val swipeThreshold = 100
private val swipeVelocityThreshold = 100
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Initializing the gesture detector
gestureDetector = GestureDetector(this)
}
// Override this method to recognize touch event
override fun onTouchEvent(event: MotionEvent): Boolean {
return if (gestureDetector.onTouchEvent(event)) {
true
}
else {
super.onTouchEvent(event)
}
}
// All the below methods are GestureDetector.OnGestureListener members
// Except onFling, all must "return false" if Boolean return type
// and "return" if no return type
override fun onDown(e: MotionEvent?): Boolean {
return false
}
override fun onShowPress(e: MotionEvent?) {
return
}
override fun onSingleTapUp(e: MotionEvent?): Boolean {
return false
}
override fun onScroll(e1: MotionEvent?, e2: MotionEvent?, distanceX: Float, distanceY: Float): Boolean {
return false
}
override fun onLongPress(e: MotionEvent?) {
return
}
override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
try {
val diffY = e2.y - e1.y
val diffX = e2.x - e1.x
if (abs(diffX) > abs(diffY)) {
if (abs(diffX) > swipeThreshold && abs(velocityX) > swipeVelocityThreshold) {
if (diffX > 0) {
Toast.makeText(applicationContext, "Left to Right swipe gesture", Toast.LENGTH_SHORT).show()
}
else {
Toast.makeText(applicationContext, "Right to Left swipe gesture", Toast.LENGTH_SHORT).show()
}
}
}
}
catch (exception: Exception) {
exception.printStackTrace()
}
return true
}
}
不需要布局代码(activity_main.xml)
可扩展标记语言
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
输出: