📌  相关文章
📜  如何在Android中以编程方式在屏幕上检测触摸事件?

📅  最后修改于: 2021-05-09 03:09:58             🧑  作者: Mango

检测到触摸确认屏幕功能正常。响应触摸是开发人员要处理的事情。由于Android设备具有基于触摸的输入,因此可以在应用触摸时对事物进行编程。为了在应用程序内显式调用方法,必须识别触摸动作。这样的方法可以具有特殊的功能。使用此类特殊功能的常见应用程序是:

  1. 游戏:大多数游戏带有触摸监听器,它们会在不同的触摸应用程序上调用不同的功能。
  2. 锁定屏幕:屏幕锁定通常是基于移动的触摸方式,单击一次不会解锁设备。而是,用户必须进行图案或划动以解锁设备。例如:基于模式的锁,滑动锁。

请注意,我们将使用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)
    }
}

输出:在物理设备上运行

想要一个节奏更快,更具竞争性的环境来学习Android的基础知识吗?
单击此处前往由我们的专家精心策划的指南,以使您立即做好行业准备!