手势

大约 3 分钟

手势

Android提供了特殊类型的触摸屏事件,例如捏,双击,滚动,长按和退格。这些都称为手势。Android提供了GestureDetector类来接收手势事件,并告诉我们这些事件是否与手势相对应。要使用它,您需要创建一个GestureDetector对象,然后使用GestureDetector.SimpleOnGestureListener扩展另一个类以充当侦听器并重写某些方法。其语法如下

  GestureDetector myG;
  myG = new GestureDetector(this,new Gesture());
  
  class Gesture extends GestureDetector.SimpleOnGestureListener{
     public boolean onSingleTapUp(MotionEvent ev) {
     }
  
     public void onLongPress(MotionEvent ev) {
     }
  
     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
     float distanceY) {
     }
  
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
     float velocityY) {
     }
  }

处理捏手势

Android提供了ScaleGestureDetector类来处理诸如捏等的手势。要使用它,您需要实例化此类的对象。它的语法如下-

  ScaleGestureDetector SGD;
  SGD = new ScaleGestureDetector(this,new ScaleListener());

第一个参数是上下文,第二个参数是事件侦听器。我们必须定义事件侦听器,并重写函数OnTouchEvent使其起作用。其语法如下-

  public boolean onTouchEvent(MotionEvent ev) {
     SGD.onTouchEvent(ev);
     return true;
  }
  
  private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
     @Override
     public boolean onScale(ScaleGestureDetector detector) {
        float scale = detector.getScaleFactor();
        return true;
     }
  }

除了捏合手势外,还有其他方法可以通知更多有关触摸事件的信息。它们在下面列出-

方法说明
getEventTime()此方法获取正在处理的当前事件的事件时间。
getFocusX()此方法获取当前手势的焦点的X坐标。
getFocusY()此方法获取当前手势焦点的Y坐标。
getTimeDelta()此方法返回以前接受的缩放事件和当前缩放事件之间的时间差(以毫秒为单位)。
isInProgress()如果正在进行缩放手势,则此方法返回true。
onTouchEvent(MotionEvent event)此方法接受MotionEvents并在适当时调度事件。

示例

这是一个演示ScaleGestureDetector类的用法的示例。它创建了一个基本应用程序,可让您通过捏放大和缩小。 为了试验该示例,您可以在实际设备上或在启用了触摸屏的仿真器中运行此示例。

  1. 您将使用Android Studio创建一个Android应用程序,并将其命名为Demo,位于com.jc2182.demo包下,如Hello World示例open in new window一章中所述。
  2. 从互联网上下载一种字体,并将其放在assets/font文件夹下。
  3. 修改src/MainActivity.java文件添加必要代码。
  4. 修改res/layout/activity_main.xml文件如果需要,可添加任何GUI组件。
  5. 运行该应用程序以启动Android模拟器并验证在该应用程序中所做更改的结果。

以下是修改后的主要活动文件src/com.jc2182.demo/MainActivity.java的内容。该文件可以包括每个基本生命周期方法。

  package com.jc2182.demo;
  

import android.app.Activity;
 import android.graphics.Matrix;
 import android.os.Bundle;
 import android.view.MotionEvent;
 import android.view.ScaleGestureDetector;
 import android.widget.ImageView;

public class MainActivity extends Activity {
 private ImageView iv;
 private Matrix matrix = new Matrix();
 private float scale = 1f;
 private ScaleGestureDetector SGD;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      iv=(ImageView)findViewById(R.id.imageView);
      SGD = new ScaleGestureDetector(this,new ScaleListener());
  }

  public boolean onTouchEvent(MotionEvent ev) {
      SGD.onTouchEvent(ev);
      return true;
  }

  private class ScaleListener extends ScaleGestureDetector.
          SimpleOnScaleGestureListener {

      @Override
      public boolean onScale(ScaleGestureDetector detector) {
          scale *= detector.getScaleFactor();
          scale = Math.max(0.1f, Math.min(scale, 5.0f));
          matrix.setScale(scale, scale);
          iv.setImageMatrix(matrix);
          return true;
      }
  }

}

以下是res/layout/activity_main.xml文件的内容-


<RelativeLayout
    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:text="手势例子" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textview"
        android:textSize="35dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="蝴蝶教程"
        android:id="@+id/textView"
        android:layout_below="@+id/textview"
        android:layout_centerHorizontal="true"
        android:textColor="#ff7aff24"
        android:textSize="35dp" />

    <ImageView
        android:background="#22112200"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView"
        android:src="@drawable/logo"
        android:scaleType="matrix"
        android:layout_below="@+id/textView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

让我们尝试运行刚刚修改的应用程序。我假设您在进行环境设置时已创建了AVD。要从Android Studio运行该应用,请打开您项目的活动文件之一,然后工具栏中单击“运行”图标。Android studio将应用程序安装在您的AVD上并启动它,如果设置和应用程序一切正常,它将显示在“模拟器”窗口下面-

现在,将两根手指放在android屏幕上,将它们分开一部分,您将看到android图像正在缩放。如下面的图像所示-