Android为手势检测提供了一个GestureDetector类,GestureDetector实例代表了一个手势检测器,创建GestureDetector时需要传入一个GestureDetector.OnGestureListener实例,GestureDetector.OnGestureListener就是一个监听器。负责对用户的手势行为提供相应。

GestureDetector.OnGestureListener里包含的事件处理方法如下。

》boolean onDown(MotionEvent e):当触碰事件按下时触发该方法。

》boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):当用户在触摸屏上“拖过”时触发该方法。其中velocityX、velocityY代表“拖过”动作在横向、纵向上的速度。

》abstract void onLongPress(MotionEvent e):当用户在屏幕上长按时触发该方法。

》boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):当用户在屏幕上“滚动”时触发该方法。

》void onShowPress(MotionEvent e):当用户在触摸屏上按下、而且还未移动和松开时触发该方法。

》boolean onSingleTapUp(MotionEvent e):用户在触摸屏上的轻击事件将会触发该方法。

使用Android的手势检测只需两个步骤。

1.创建一个GestureDetector对象。创建该对象时必须实现一个GestureDetector.OnGestureListener监听器实例。

2.为应用程序的Activity(偶尔也可为特定组件)的TouchEvent事件绑定监听器,在事件处理中指定把Activity(或特定组件)上的TouchEvent事件交给GestureDetector处理。

经过上面两个步骤之后,Activity(或特定组件)上的TouchEvent事件就会交给GestureDetector处理,而GestureDetector就会检测是否触发了特定的手势动作。

下面的程序测试了用户的不同动作到底触发那种手势动作。

package com.example.androidioanddatastore.gesturedetector;import com.example.androidioanddatastore.R;import android.app.Activity;import android.os.Bundle;import android.view.GestureDetector.OnGestureListener;import android.view.GestureDetector;import android.view.MotionEvent;import android.widget.Toast;/** * GestureDetector的使用 * @author Administrator * */public class GestureActivity extends Activity implements OnGestureListener {/**定义手势监听器实例*/private GestureDetector mDetector;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_gesture);//创建手势监听器mDetector = new GestureDetector(this, this);}/** * 将该activity上的触碰事件交给GestureDetector处理 * */@Overridepublic boolean onTouchEvent(MotionEvent event) {return mDetector.onTouchEvent(event);}@Overridepublic boolean onDown(MotionEvent e) {Toast.makeText(this, "按下", Toast.LENGTH_SHORT).show();return false;}@Overridepublic void onShowPress(MotionEvent e) {Toast.makeText(this, "按下,而且还未移动和松开", Toast.LENGTH_SHORT).show();}@Overridepublic boolean onSingleTapUp(MotionEvent e) {Toast.makeText(this, "轻击事件", Toast.LENGTH_SHORT).show();return false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {Toast.makeText(this, "上下滚动", Toast.LENGTH_SHORT).show();return false;}@Overridepublic void onLongPress(MotionEvent e) {Toast.makeText(this, "长按时", Toast.LENGTH_SHORT).show();}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {Toast.makeText(this, "左右拖过", Toast.LENGTH_SHORT).show();return false;}}
上面的demo,只是简单地检测到了当用户随意在屏幕上触碰时,到底执行了那些手势。

下面的demo,是通过手势来缩放图片。

demo只是来联系GestureDetector的使用,在手机上面测试,发现每个触摸事件的回调方法会被触发多次,demo中,图片的资源回收会出现问题。。。。

1.activity

package com.example.androidioanddatastore.gesturedetector;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.graphics.drawable.BitmapDrawable;import android.os.Bundle;import android.view.GestureDetector;import android.view.GestureDetector.OnGestureListener;import android.view.MotionEvent;import android.widget.ImageView;import com.example.androidioanddatastore.R;/*** * GestureDetector实现图片缩放 * @author Administrator * */public class GestureZoomActivity extends Activity implements OnGestureListener{/**定义手势检测器实例*/private GestureDetector mDetector;/**缩放组件*/private ImageView mImageView;/**初始的图片资源*/private Bitmap mBitmap;/**图片的宽高*/private int width, height;/**记录当前的缩放比*/private float currentScale = 1f;/**控制图片缩放的Matrix对象*/private Matrix mMatrix;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_gesture_zoom);//创建手势监听器对象mDetector = new GestureDetector(this, this);mImageView = (ImageView) findViewById(R.id.imageview);mMatrix = new Matrix();//获取被缩放的源图片mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);//获取位图的宽高width = mBitmap.getWidth();height = mBitmap.getHeight();//设置ImageView初始化时显示的图片mImageView.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));}@Overridepublic boolean onTouchEvent(MotionEvent event) {//将该activity上面的触碰事件交给GestureDetector处理return mDetector.onTouchEvent(event);}/** * 左右滑动回调事件 */@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {velocityX = velocityX > 4000 ? 4000 : velocityX;velocityX = velocityX < -4000 ? -4000 : velocityX;//根据手势速度来计算缩放比,如果velocityX>0,放大图像,否则缩小图片currentScale += currentScale * velocityX / 4000.0f;//保证currentScale不等于0currentScale = currentScale > 0.01 ? currentScale : 0.01f;//重置MatrixmMatrix.reset();//缩放MatrixmMatrix.setScale(currentScale, currentScale, 160, 200);BitmapDrawable tmp = (BitmapDrawable) mImageView.getDrawable();//如果图片还未回收,先强制回收图片if(tmp.getBitmap().isRecycled()){tmp.getBitmap().recycle();}//根据源位图和Matrix创建新位图Bitmap bitmap = Bitmap.createBitmap(mBitmap, 0, 0, width, height, mMatrix, true);//显示新位图mImageView.setImageBitmap(bitmap);return true;}@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {// TODO Auto-generated method stubreturn false;}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stub}}
2.xml布局

    

更多相关文章

  1. android GLSurfaceView渲染模式
  2. Android(安卓)View动画开发笔记
  3. Android(安卓)WebView如何加载assets下的html文件
  4. android widget(桌面小部件)实现
  5. Android监听耳机按键事件
  6. 格式化字符串长度,超出部分显示省略号,区分汉字跟字母
  7. Android(安卓)4.2 BT系统之蓝牙关闭过程全跟踪
  8. android之fragment与fragment、activity与activity、fragment与a
  9. 自定义View实现图片的绘制、旋转、缩放

随机推荐

  1. 浙大网新-开启安卓开发高薪时代
  2. android studio单元测试
  3. Android(安卓)呼吸灯流程分析(一)
  4. Android(安卓)requires compiler complia
  5. Android中设置控件透明度的方法
  6. Android开发(一)Android搭建、HelloWorld
  7. mono for android 百度map binding项目
  8. android 利用ksoap2方式连接webservice
  9. android EditText inputType 及 android:
  10. android文件存储