跳转至

如何在安卓系统中编程检测屏幕触摸事件?

原文:https://www . geesforgeks . org/如何在安卓系统中以编程方式检测屏幕触摸事件/

检测到触摸确认屏幕功能正常。响应触摸是开发人员要处理的事情。由于安卓设备有一个基于触摸的输入,事情是通过触摸的应用来编程的。为了在应用程序中显式调用方法,必须识别触摸动作。这样的方法可以有特殊的功能。使用此类特殊功能的常见应用有:

  1. 游戏:大多数游戏都带有触摸监听器,可以在不同的触摸应用上调用不同的功能。
  2. 锁屏:锁屏一般是基于触摸移动的,一次轻击并不能解锁设备。相反,用户必须做出图案或刷卡来解锁设备。例如:基于模式的锁,刷卡锁。

注意,我们将使用 Kotlin 语言来实现这个项目。

检测屏幕上的触摸

要检查安卓系统屏幕上是否有触摸动作,我们将按照以下步骤操作:

第一步:创建新项目

要在安卓工作室创建新项目,请参考如何在安卓工作室创建/启动新项目。注意选择科特林作为编程语言。没有对 activity_main.xml 文件进行更改。

步骤 2:使用 MainActivity.kt 文件

最后转到 MainActivity.kt 文件,参考下面的代码。下面是 MainActivity.kt 文件的代码。代码中添加了注释,以更详细地理解代码。

我的锅

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)
        }
    }
}

输出:在物理设备上运行

在子类视图中检测触摸

要检查在安卓屏幕上显示的特定视图中是否有触摸移动,我们将遵循以下步骤:

第一步:创建新项目

要在安卓工作室创建新项目,请参考如何在安卓工作室创建/启动新项目。注意选择科特林作为编程语言。

步骤 2:使用 activity_main.xml 文件

转到代表应用程序 UI 的 activity_main.xml 文件,创建一个 LinearLayout ,给它一个深色背景,没有其他元素,这样我们就可以看到触摸的观感。下面是activity _ main . XML文件的代码。

可扩展标记语言

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!--View (Sub-Class) where OnTouchListener is implemented-->
    <LinearLayout
        android:id="@+id/view1"
        android:layout_width="300sp"
        android:layout_height="400sp"
        android:layout_centerInParent="true"
        android:background="@color/colorPrimaryDark"
        android:orientation="horizontal">
    </LinearLayout>

</RelativeLayout>

第三步:使用 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<View>(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
            }
        }
    }
}

输出:在物理设备上运行

检测多个视图上的触摸

要检查安卓屏幕上显示的多个视图中是否有触摸移动,我们将遵循以下步骤:

第一步:创建新项目

要在安卓工作室创建新项目,请参考如何在安卓工作室创建/启动新项目。注意选择科特林作为编程语言。

步骤 2:使用 activity_main.xml 文件

转到代表应用程序 UI 的 activity_main.xml 文件,创建一个 LinearLayout ,给它一个深色背景,没有其他元素,这样我们就可以看到触摸的观感。下面是activity _ main . XML文件的代码。

可扩展标记语言

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!--View (Sub-Class) where OnTouchListener is implemented-->
    <LinearLayout
        android:id="@+id/view1"
        android:layout_width="300sp"
        android:layout_height="400sp"
        android:layout_centerInParent="true"
        android:background="@color/colorPrimaryDark"
        android:orientation="horizontal">
    </LinearLayout>

</RelativeLayout>

第三步:使用 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<View>(R.id.main_view)
        val subView = findViewById<View>(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)
    }
}

输出:在物理设备上运行



回到顶部