检测到触摸确认屏幕功能正常。响应触摸是开发人员要处理的事情。由于Android设备具有基于触摸的输入,因此可以在应用触摸时对事物进行编程。为了在应用程序内显式调用方法,必须识别触摸动作。这样的方法可以具有特殊的功能。使用此类特殊功能的常见应用程序是:
- 游戏:大多数游戏带有触摸监听器,它们会在不同的触摸应用程序上调用不同的功能。
- 锁定屏幕:屏幕锁定通常是基于移动的触摸方式,单击一次不会解锁设备。而是,用户必须进行图案或划动以解锁设备。例如:基于模式的锁,滑动锁。
请注意,我们将使用Kotlin语言实施此项目。
检测屏幕上的触摸
要检查Android屏幕上是否有触摸动作,我们将按照以下步骤操作:
步骤1:创建一个新项目
要在Android Studio中创建新项目,请参阅如何在Android Studio中创建/启动新项目。请注意,选择Kotlin作为编程语言。没有对activity_main.xml文件进行任何更改。
步骤2:使用MainActivity.kt文件
最后,转到MainActivity.kt文件,并参考以下代码。下面是MainActivity.kt文件的代码。在代码内部添加了注释,以更详细地了解代码。
Kotlin
import android.os.Bundle
import android.view.MotionEvent
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.MotionEventCompat
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Do Nothing
}
// create an override function onTouchEvent that takes
// in the MotionEvent and returns a boolean value
override fun onTouchEvent(event: MotionEvent): Boolean {
return when (MotionEventCompat.getActionMasked(event)) {
// Display a Toast whenever a movement is captured on the screen
MotionEvent.ACTION_MOVE -> {
Toast.makeText(applicationContext, "Action was MOVE", Toast.LENGTH_SHORT).show()
true
}
else -> super.onTouchEvent(event)
}
}
}
XML
Kotlin
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.MotionEvent
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.MotionEventCompat
class MainActivity : AppCompatActivity() {
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// View (Sub-Class) where onTouchEvent is implemented
val v1 = findViewById(R.id.view1)
// OnTouchListener on the selected view
v1.setOnTouchListener { v, event ->
return@setOnTouchListener when (MotionEventCompat.getActionMasked(event)) {
MotionEvent.ACTION_DOWN -> {
// Make a Toast when movements captured on the sub-class
Toast.makeText(applicationContext, "Move", Toast.LENGTH_SHORT).show()
true
}
else -> false
}
}
}
}
XML
Kotlin
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.MotionEvent
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.MotionEventCompat
class MainActivity : AppCompatActivity() {
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// mainView is nothing but the parent activity_main layout
// subView is a explicitly declared Linear
// Layout and occupies a minor part of the screen
val mainView = findViewById(R.id.main_view)
val subView = findViewById(R.id.view1)
// OnTouchListener on the Screen
mainView.setOnTouchListener { v, event ->
return@setOnTouchListener when (MotionEventCompat.getActionMasked
(event)) {
MotionEvent.ACTION_DOWN -> {
if (isInside(subView, event)) {
Toast.makeText(applicationContext, "Inside", Toast.LENGTH_SHORT).show()
}
if (!isInside(subView, event)) {
Toast.makeText(applicationContext, "Outside", Toast.LENGTH_SHORT).show()
}
true
}
else -> false
}
}
}
// V shall be the subclass i.e. the subView declared in onCreate function
// This functions confirms the dimensions of the view (subView in out program)
private fun isInside(v: View, e: MotionEvent): Boolean {
return !(e.x < 0 || e.y < 0 || e.x > v.measuredWidth ||
e.y > v.measuredHeight)
}
}
输出:在物理设备上运行
在子类视图中检测触摸
要检查Android屏幕上显示的特定视图中是否有触摸运动,我们将执行以下步骤:
步骤1:创建一个新项目
要在Android Studio中创建新项目,请参阅如何在Android Studio中创建/启动新项目。请注意,选择Kotlin作为编程语言。
步骤2:使用activity_main.xml文件
转到代表应用程序UI的activity_main.xml文件,创建一个LinearLayout,为其提供深色背景,没有其他元素,以便我们可以看到触摸印象。以下是activity_main.xml文件的代码。
XML格式
步骤3:使用MainActivity.kt文件
最后,转到MainActivity.kt文件,并参考以下代码。下面是MainActivity.kt文件的代码。在代码内部添加了注释,以更详细地了解代码。
科特林
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.MotionEvent
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.MotionEventCompat
class MainActivity : AppCompatActivity() {
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// View (Sub-Class) where onTouchEvent is implemented
val v1 = findViewById(R.id.view1)
// OnTouchListener on the selected view
v1.setOnTouchListener { v, event ->
return@setOnTouchListener when (MotionEventCompat.getActionMasked(event)) {
MotionEvent.ACTION_DOWN -> {
// Make a Toast when movements captured on the sub-class
Toast.makeText(applicationContext, "Move", Toast.LENGTH_SHORT).show()
true
}
else -> false
}
}
}
}
输出:在物理设备上运行
在多个视图上检测触摸
要检查Android屏幕上显示的多个视图中是否存在触摸移动,我们将按照以下步骤操作:
步骤1:创建一个新项目
要在Android Studio中创建新项目,请参阅如何在Android Studio中创建/启动新项目。请注意,选择Kotlin作为编程语言。
步骤2:使用activity_main.xml文件
转到代表应用程序UI的activity_main.xml文件,创建一个LinearLayout,为其提供深色背景,没有其他元素,以便我们可以看到触摸印象。以下是activity_main.xml文件的代码。
XML格式
步骤3:使用MainActivity.kt文件
最后,转到MainActivity.kt文件,并参考以下代码。下面是MainActivity.kt文件的代码。在代码内部添加了注释,以更详细地了解代码。
科特林
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.MotionEvent
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.MotionEventCompat
class MainActivity : AppCompatActivity() {
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// mainView is nothing but the parent activity_main layout
// subView is a explicitly declared Linear
// Layout and occupies a minor part of the screen
val mainView = findViewById(R.id.main_view)
val subView = findViewById(R.id.view1)
// OnTouchListener on the Screen
mainView.setOnTouchListener { v, event ->
return@setOnTouchListener when (MotionEventCompat.getActionMasked
(event)) {
MotionEvent.ACTION_DOWN -> {
if (isInside(subView, event)) {
Toast.makeText(applicationContext, "Inside", Toast.LENGTH_SHORT).show()
}
if (!isInside(subView, event)) {
Toast.makeText(applicationContext, "Outside", Toast.LENGTH_SHORT).show()
}
true
}
else -> false
}
}
}
// V shall be the subclass i.e. the subView declared in onCreate function
// This functions confirms the dimensions of the view (subView in out program)
private fun isInside(v: View, e: MotionEvent): Boolean {
return !(e.x < 0 || e.y < 0 || e.x > v.measuredWidth ||
e.y > v.measuredHeight)
}
}