Detecting a touch confirms that the screen is fully functional. Responding to touch is something that a developer deals with. As Android devices have a touch-based input, things are programmed upon application of touch. For explicitly calling methods within the application, a touch action must be recognized. Such methods can have special functions. Common applications that use such special functions are:
- Games: Most of the games come with touch listeners, that invoke different functions upon different touch applications.
- Lock Screen: Screen Locks are generally touched movement-based, where a single tap doesn’t unlock the device. Rather, a pattern or a swipe has to be made by the user to unlock the device. Ex: Pattern-based locks, swipe locks.
Note that we are going to implement this project using the Kotlin language.
Detect Touch on Screen
To check if there were touch movements on a screen in Android, we shall follow the following steps:
Step 1: Create a New Project
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. Note that select Kotlin as the programming language. There are no changes made to the activity_main.xml file.
Step 2: Working with the MainActivity.kt file
Finally, go to the MainActivity.kt file, and refer to the following code. Below is the code for the MainActivity.kt file. Comments are added inside the code to understand the code in more detail.
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)
}
override fun onTouchEvent(event: MotionEvent): Boolean {
return when (MotionEventCompat.getActionMasked(event)) {
MotionEvent.ACTION_MOVE -> {
Toast.makeText(applicationContext, "Action was MOVE" , Toast.LENGTH_SHORT).show()
true
}
else -> super .onTouchEvent(event)
}
}
}
|
Output: Run on Physical Device
Detect Touch in a Sub-Class View
To check if there were touch movements in a specific view displayed on a screen in Android, we shall follow the following steps:
Step 1: Create a New Project
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. Note that select Kotlin as the programming language.
Step 2: Working with the activity_main.xml file
Go to the activity_main.xml file which represents the UI of the application, and create a LinearLayout, give it a dark background, and no other elements so that we can see the touch impressions. Below is the code for the activity_main.xml file.
XML
<? xml version = "1.0" encoding = "utf-8" ?>
< RelativeLayout
android:id = "@+id/main_view"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".MainActivity" >
< 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 >
|
Step 3: Working with the MainActivity.kt file
Finally, go to the MainActivity.kt file, and refer to the following code. Below is the code for the MainActivity.kt file. Comments are added inside the code to understand the code in more detail.
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)
val v1 = findViewById<View>(R.id.view1)
v1.setOnTouchListener { v, event ->
return @setOnTouchListener when (MotionEventCompat.getActionMasked(event)) {
MotionEvent.ACTION_DOWN -> {
Toast.makeText(applicationContext, "Move" , Toast.LENGTH_SHORT).show()
true
}
else -> false
}
}
}
}
|
Output: Run on Physical Device
Detect Touch on Multiple Views
To check if there were touch movements in multiple views displayed on a screen in Android, we shall follow the following steps:
Step 1: Create a New Project
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. Note that select Kotlin as the programming language.
Step 2: Working with the activity_main.xml file
Go to the activity_main.xml file which represents the UI of the application, and create a LinearLayout, give it a dark background, and no other elements so that we can see the touch impressions. Below is the code for the activity_main.xml file.
XML
<? xml version = "1.0" encoding = "utf-8" ?>
< RelativeLayout
android:id = "@+id/main_view"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".MainActivity" >
< 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 >
|
Step 3: Working with the MainActivity.kt file
Finally, go to the MainActivity.kt file, and refer to the following code. Below is the code for the MainActivity.kt file. Comments are added inside the code to understand the code in more detail.
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)
val mainView = findViewById<View>(R.id.main_view)
val subView = findViewById<View>(R.id.view1)
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
}
}
}
private fun isInside(v: View, e: MotionEvent): Boolean {
return !(e.x < 0 || e.y < 0 || e.x > v.measuredWidth ||
e.y > v.measuredHeight)
}
}
|
Output: Run on Physical Device