En este artículo, crearemos una aplicación a través de la cual un usuario puede mover un objeto visible en la pantalla de acuerdo con los movimientos de sus dedos en la pantalla. Tocar para arrastrar/mover objetos (como imagen, botón) es muy popular en juegos como Rompecabezas. Aquí crearemos una forma simple de tocar y arrastrar una imagen en la pantalla de un dispositivo después de que el usuario finalice esta acción, la imagen tendrá una nueva ubicación en la pantalla del dispositivo usando view onTouchListener . A continuación se proporciona un GIF de muestra para tener una idea de lo que vamos a hacer en este artículo. Tenga en cuenta que vamos a implementar este proyecto utilizando el lenguaje Kotlin .
Implementación paso a paso
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: Establecer cualquier objeto de imagen en el diseño
Vaya a la aplicación > res > diseño > actividad_principal.xml y agregue el siguiente código a ese archivo. A continuación se muestra el código para el archivo activity_main.xml .
XML
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <ImageView android:id="@+id/image" android:layout_width="100dp" android:layout_height="100dp" android:contentDescription="moving object" android:src="@drawable/gfg" /> </RelativeLayout> </androidx.constraintlayout.widget.ConstraintLayout>
Paso 3: trabajar con el archivo MainActivity.kt
Vaya al archivo MainActivity.kt y consulte el siguiente código. A continuación se muestra el código del archivo MainActivity.kt . Se agregan comentarios dentro del código para comprender el código con más detalle.
Kotlin
import android.annotation.SuppressLint import android.os.Bundle import android.view.MotionEvent import android.view.View.OnTouchListener import android.view.ViewGroup import android.widget.ImageView import android.widget.RelativeLayout import android.widget.Toast import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { private lateinit var mainLayout: ViewGroup private lateinit var image: ImageView // default position of image private var xDelta = 0 private var yDelta = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mainLayout = findViewById(R.id.main) image = findViewById(R.id.image) // returns True if the listener has // consumed the event, otherwise False. image.setOnTouchListener(onTouchListener()) } @SuppressLint("ClickableViewAccessibility") private fun onTouchListener(): OnTouchListener { return OnTouchListener { view, event -> // position information // about the event by the user val x = event.rawX.toInt() val y = event.rawY.toInt() // detecting user actions on moving when (event.action and MotionEvent.ACTION_MASK) { MotionEvent.ACTION_DOWN -> { val lParams = view.layoutParams as RelativeLayout.LayoutParams xDelta = x - lParams.leftMargin yDelta = y - lParams.topMargin } MotionEvent.ACTION_UP -> Toast.makeText(this, "new location!", Toast.LENGTH_SHORT) .show() MotionEvent.ACTION_MOVE -> { // based on x and y coordinates (when moving image) // and image is placed with it. val layoutParams = view.layoutParams as RelativeLayout.LayoutParams layoutParams.leftMargin = x - xDelta layoutParams.topMargin = y - yDelta layoutParams.rightMargin = 0 layoutParams.bottomMargin = 0 view.layoutParams = layoutParams } } // reflect the changes on screen mainLayout.invalidate() true } } }
Ahora, ejecuta la aplicación.
Producción: