跳转至

安卓手势示例

原文:https://www . geesforgeks . org/Android-手势-带示例/

安卓支持一系列触摸手势,如轻点双击捏一下刷一下滚动长按拖动甩一下。拖动和投掷看似相似,但拖动是当用户在触摸屏上拖动手指时发生的滚动类型,而投掷手势发生在用户拖动并快速抬起手指时。运动事件通过动作代码描述触摸事件的状态。安卓支持一长串动作代码:

  • ACTION_DOWN: 触摸事件已经开始。
  • 动作 _ 移动:触摸事件期间发生的变化(在动作 _ 向下和动作 _ 向上之间)
  • ACTION_UP: 触摸事件已经结束。这包含最终发布位置。
  • ACTION_CANCEL: 手势被取消。

注意:您应该在 ACTION_CANCEL 和 ACTION_UP 事件期间执行相同的操作。

重要方法

  • getAction() :从事件参数中提取用户执行的动作。

重要接口

  • 手势检测器。OnGestureListener :当特定触摸事件发生时通知用户。
  • 手势检测器。OnDoubleTalistener:当双击事件发生时通知用户。

例 1

让我们来看看对 ACTION_DOWN、ACTION_UP 等事件执行一些简单操作的方法。

第一步 : 新建项目

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

步骤 2:使用 activity_main.xml 文件

转到 activity_main.xml 文件,参考以下代码。下面是 activity_main.xml 文件的代码。

可扩展标记语言

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

    <TextView
        android:id="@+id/gesture"
        android:layout_width="398dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:hint="Gestures"
        android:textAlignment="center"
        android:textColor="@android:color/black"
        android:textSize="50sp"></TextView>

</FrameLayout>

第三步:使用 MainActivity.kt 文件

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

我的锅

import android.os.Bundle
import android.util.Log
import android.view.MotionEvent
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

// logs are added for better understanding. 
private const val TAG = "Gestures"

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {

        return when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                // when we touch or tap on the screen
                Log.d(TAG, "Action was DOWN")
                gesture.text = "Action was DOWN"
                true
            }
            MotionEvent.ACTION_MOVE -> {
                // while pressing on the screen, 
                // we move our finger
                Log.d(TAG, "Action was MOVE")
                gesture.text = "Action was MOVE"

                true
            }
            MotionEvent.ACTION_UP -> {
                // Lifting up the finger after
                // pressing on the screen
                Log.d(TAG, "Action was UP")
                gesture.text = "Action was UP"

                true
            }
            MotionEvent.ACTION_CANCEL -> {
                Log.d(TAG, "Action was CANCEL")
                gesture.text = "Action was CANCEL"

                true
            }
            MotionEvent.ACTION_OUTSIDE -> {
                Log.d(TAG, "Movement occurred outside of screen element")
                gesture.text = "Movement occurred screen element"

                true
            }
            else -> super.onTouchEvent(event)
        }
    }
}

注意:你可能会在下面一行得到一个错误:

导入 kot linx . Android . synthetic . main . activity _ main。*

请参考这个来修复这个错误。

输出:

输出说明:

  • 当我们点击屏幕或按下屏幕时,可以看到视频中显示动作为 DOWN
  • 当我们按下鼠标或手指时,文本视图显示动作为移动
  • 当我松开鼠标或抬起手指时,它显示动作为 UP

例 2

现在让我们来看看在事件上执行一些动作的方法,如单击、双击、长按等。下面的代码使用与上面相同的 activity_main.xml

使用 MainActivity.kt 文件:

我的锅

import android.os.Bundle
import android.util.Log
import android.view.GestureDetector
import android.view.MotionEvent
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.GestureDetectorCompat
import kotlinx.android.synthetic.main.activity_main.*

// logs are added for better understanding. 
private const val TAG = "Gestures"

// We have to implement the members as well
// because we are implementing the interfaces.
class MainActivity : AppCompatActivity(), GestureDetector.OnGestureListener, 
                                       GestureDetector.OnDoubleTapListener {

    private lateinit var detectorCompat: GestureDetectorCompat

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Instantiate the gesture detector with the
        // application context and an implementation of
        // GestureDetector.OnGestureListener
        // since we have implemented these 
        // interfaces we can simply us the
        // this keyword to refer to the current activity
        detectorCompat = GestureDetectorCompat(this, this)
    }

    // this function connects touch events to gestures
    override fun onTouchEvent(event: MotionEvent): Boolean {
        return if (detectorCompat.onTouchEvent(event)) {
            true
        } else {
            super.onTouchEvent(event)
        }
    }

    override fun onDown(event: MotionEvent): Boolean {
        Log.d(TAG, "onDown: $event")
        return true
    }

    override fun onFling(
            event1: MotionEvent,
            event2: MotionEvent,
            velocityX: Float,
            velocityY: Float
    ): Boolean {
        Log.d(TAG, "onFling: $event1 $event2")
        return true
    }

    override fun onLongPress(event: MotionEvent) {
        Log.d(TAG, "onLongPress: $event")
        gesture.text = "Long Press"
    }

    override fun onScroll(
            event1: MotionEvent,
            event2: MotionEvent,
            distanceX: Float,
            distanceY: Float
    ): Boolean {
        Log.d(TAG, "onScroll: $event1 $event2")
        return true
    }

    override fun onShowPress(event: MotionEvent) {
        Log.d(TAG, "onShowPress: $event")
        gesture.text = "Press"
    }

    override fun onSingleTapUp(event: MotionEvent): Boolean {
        Log.d(TAG, "onSingleTapUp: $event")
        gesture.text = "Single Tap"

        return true
    }

    override fun onDoubleTap(event: MotionEvent): Boolean {
        Log.d(TAG, "onDoubleTap: $event")
        gesture.text = "DoubleTap"

        return true
    }

    override fun onDoubleTapEvent(event: MotionEvent): Boolean {
        Log.d(TAG, "onDoubleTapEvent: $event")

          // simple toast
        Toast.makeText(this, "Double Tap", Toast.LENGTH_SHORT).show() 
        return true
    }

    override fun onSingleTapConfirmed(event: MotionEvent): Boolean {
        Log.d(TAG, "onSingleTapConfirmed: $event")
        gesture.text = "Single Tap Confirmed"

        return true
    }
}

输出:

输出说明:

  • 当我们单次点击屏幕时,它显示单次点击,然后单次点击确认,因为活动没有取消
  • 当我们按下屏幕时,它会显示按下,如果我继续按下去,它会显示长按。
  • 当我们双击时,双击会显示在文本视图和吐司中。

注意:onTouchEvent() 用于活动,但您可以附加一个视图。使用settontouchlistener()方法将对象设置为任何视图对象。

通过这种方法,您可以在视图内触发事件时执行操作,因为 OnTouchListener 附加到该特定视图。例如,对于 id 为“小鬼”的 ImageView

img . setontouchlistener { view,motionEvent ->

// …响应触摸事件

真实的

}

//用于一般视图

查找查看者{ v,事件->

// …响应触摸事件

真实的

}



回到顶部