随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)
概念:所谓手势,其实是指用户手指或触摸笔在触摸屏上的连续触碰行为,比如在屏幕上从左至右划出的一个动作,就是手势,再比如在屏幕上画出一个圆圈也是手势。手势这种连续的触碰会形成某个方向上的移动趋势,也会形成一个不规则的几何图形。Android对两种手势行为都提供了支持。
对于第一种手势行为而言,Android提供了手势检测,并为手势检测提供了相应的监听器。
对于第二种手势行为,Android允许开发者添加手势,并提供了相应的API识别用户手势。
下面先看手势检测:
Android为手势检测提供了一个GestureDetector类,即手势检测器。创建检测器对象需要传入一个GestureDetector.OnGestureListener监听器实例,该监听器包含如下方法:
下面通过一个简单实例来测试这些方法是在什么情况下触发的,代码如下:
Activity:
package com.lovo.activity;
import android.os.Bundle;
import android.app.Activity;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.widget.TextView;
public class MainActivity extends Activity implements OnGestureListener {
// 定义手势检测器实例
private GestureDetector detector;
// 定义TextView对象
TextView tv1, tv2, tv3, tv4, tv5, tv6;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取TextView实例
tv1 = (TextView) findViewById(R.id.tv1);
tv2 = (TextView) findViewById(R.id.tv2);
tv3 = (TextView) findViewById(R.id.tv3);
tv4 = (TextView) findViewById(R.id.tv4);
tv5 = (TextView) findViewById(R.id.tv5);
tv6 = (TextView) findViewById(R.id.tv6);
// 创建手势检测器
detector = new GestureDetector(this);
}
// 将该Activity上的触碰事件交给GestureDetector处理
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
tv1.setText("");
tv2.setText("");
tv3.setText("");
tv4.setText("");
tv5.setText("");
tv6.setText("");
}
return detector.onTouchEvent(event);
}
@Override
public boolean onDown(MotionEvent e) {
tv1.setText("执行了onDown");
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
tv2.setText("执行了onFling");
return false;
}
@Override
public void onLongPress(MotionEvent e) {
tv3.setText("执行了onLongPress");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
tv4.setText("执行了onScroll");
return false;
}
@Override
public void onShowPress(MotionEvent e) {
tv5.setText("执行了onShowPress");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
tv6.setText("执行了onSingleTapUp");
return false;
}
}
布局XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv4"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv5"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv6"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>