¿Cómo detectar eventos táctiles en la pantalla mediante programación en Android?

La detección de un toque confirma que la pantalla es completamente funcional. Responder al tacto es algo con lo que se ocupa un desarrollador. Como los dispositivos Android tienen una entrada táctil, las cosas se programan al aplicar el toque. Para llamar explícitamente a métodos dentro de la aplicación, se debe reconocer una acción táctil. Dichos métodos pueden tener funciones especiales. Las aplicaciones comunes que usan tales funciones especiales son:

  1. Juegos: la mayoría de los juegos vienen con oyentes táctiles, que invocan diferentes funciones en diferentes aplicaciones táctiles.
  2. Pantalla de bloqueo: los bloqueos de pantalla generalmente se tocan en función del movimiento, donde un solo toque no desbloquea el dispositivo. Más bien, el usuario debe hacer un patrón o deslizar el dedo para desbloquear el dispositivo. Ej.: bloqueos basados ​​en patrones, bloqueos de deslizamiento.

Detectar toque en pantalla

Para comprobar si hubo movimientos táctiles en una pantalla en Android, seguiremos los siguientes pasos:

Paso 1: Crear un nuevo proyecto

Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Kotlin como lenguaje de programación. No se han realizado cambios en la actividad_principal.xml

Paso 2: trabajar con el archivo MainActivity.kt

Finalmente, vaya al archivo MainActivity.kt y consulte el siguiente código. 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)
        }
    }
}

Salida: ejecutar en dispositivo físico

Detectar toque en una vista de subclase

Para comprobar si hubo movimientos táctiles en una determinada vista mostrada en una pantalla en Android, seguiremos los siguientes pasos:

Paso 1: Crear un nuevo proyecto

Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Kotlin como lenguaje de programación.

Paso 2: trabajar con el archivo activity_main.xml

Vaya al archivo activity_main.xml que representa la interfaz de usuario de la aplicación y cree un LinearLayout , asígnele un fondo oscuro y ningún otro elemento para que podamos ver las impresiones táctiles. actividad_principal.xml

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>

Paso 3: trabajar con el archivo MainActivity.kt

Finalmente, vaya al archivo MainActivity.kt y consulte el siguiente código. MainActivity.kt

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

Salida: ejecutar en dispositivo físico

Detectar toque en múltiples vistas

Para comprobar si hubo movimientos táctiles en múltiples vistas mostradas en una pantalla en Android, seguiremos los siguientes pasos:

Paso 1: Crear un nuevo proyecto

Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Kotlin como lenguaje de programación.

Paso 2: trabajar con el archivo activity_main.xml

Vaya al archivo activity_main.xml que representa la interfaz de usuario de la aplicación y cree un LinearLayout , asígnele un fondo oscuro y ningún otro elemento para que podamos ver las impresiones táctiles. actividad_principal.xml

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>

Paso 3: trabajar con el archivo MainActivity.kt

Finalmente, vaya al archivo MainActivity.kt y consulte el siguiente código. MainActivity.kt

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

Salida: ejecutar en dispositivo físico

Publicación traducida automáticamente

Artículo escrito por aashaypawar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *