前言:android的手势可以通过gestureDetector类完成。
实现手势方式
1)通过重写onTouchEvent方法
2)实现OnTouchListener类,重写onTouch方法。
不管哪一种,都需要将touch事件交给gestureDetector来管理。
private GestureDetector gestureDetector;@Override public void onCreate(Bundle savedInstanceState) {gestureDetector = new GestureDetector(this);}@Override public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); }
现在我们就简单的实现一个图片翻页的效果。
1.xml布局
2.重写OnGestureListener的onFling方法
onFling--快速的在屏幕上滑动,如果不够快,只有onScroll事件了。
除了onFling方法外,还需要从写以下方法
onDown --放第一时间手指接触到屏幕的时候
onShowPress--按住屏幕,但是未达到onLongPress时间前
onSingleTapUp--onDown之后,离开屏幕。如果有onShowPress、onLongPress事件,则不在响应
onScroll--滑动事件,不管快慢,都会响应
onLongPress--长按事件
//按下的时候触发 @Override public boolean onDown(MotionEvent e) { Log.e("GestureActivity", "onDown--"+e.getAction()); return false; } //按住 且为达到onLongPress之前 调用 一旦调用就不会有onSingleTapUp @Override public void onShowPress(MotionEvent e) { Log.e("GestureActivity", "onShowPress"); } // 离开屏幕的一刹那 @Override public boolean onSingleTapUp(MotionEvent e) { Log.e("GestureActivity", "onSingleTapUp"); return false; } // 滚动 @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.e("GestureActivity", "onScroll"); return false; } // 长按 不松开 @Override public void onLongPress(MotionEvent e) { Log.e("GestureActivity", "onLongPress"); }
关于onFling实现图片翻页的逻辑
private int images[] = new int[] { R.drawable.facebook, R.drawable.google, R.drawable.gtalk };//定义了展示的图片 private final int X_MOVE_INSTANCE=100;//X轴位移距离 private final int X_MOVE_SPEED=200;//X轴移动速度 随便大点都几千 private int position=0;//图片初始值@Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.e("GestureActivity", "onFling" ); //右翻 if((e2.getX()-e1.getX()>X_MOVE_INSTANCE)&&velocityX>X_MOVE_SPEED){ imageView.setImageResource(images[++position%images.length]); }else //左翻 if((e1.getX()-e2.getX()>X_MOVE_INSTANCE)&&Math.abs(velocityX)>X_MOVE_SPEED){ imageView.setImageResource(images[++position%images.length]); } return false; }
需要稍微注意下
++position%images.length的写法。 完整代码如下
1 public class GestureActivity extends Activity implements OnGestureListener { 2 private ImageView imageView; 3 private GestureDetector gestureDetector; 4 private int images[] = new int[] { R.drawable.facebook, R.drawable.google, 5 R.drawable.gtalk }; 6 private final int X_MOVE_INSTANCE=100;//X轴位移距离 7 private final int X_MOVE_SPEED=200;//X轴移动速度 随便大点都几千 8 private int position=0;//图片初始值 9 10 @Override11 public void onCreate(Bundle savedInstanceState) {12 super.onCreate(savedInstanceState);13 setContentView(R.layout.main);14 15 imageView = (ImageView) findViewById(R.id.imageView);16 imageView.setImageResource(images[position]);17 gestureDetector = new GestureDetector(this);18 19 }20 21 @Override22 public boolean onTouchEvent(MotionEvent event) {23 return gestureDetector.onTouchEvent(event);24 }25 26 //按下的时候触发27 @Override28 public boolean onDown(MotionEvent e) {29 Log.e("GestureActivity", "onDown--"+e.getAction());30 return false;31 }32 33 //按住 且为达到onLongPress之前 调用 一旦调用就不会有onSingleTapUp34 @Override35 public void onShowPress(MotionEvent e) {36 Log.e("GestureActivity", "onShowPress");37 38 }39 40 // 离开屏幕的一刹那41 @Override42 public boolean onSingleTapUp(MotionEvent e) {43 Log.e("GestureActivity", "onSingleTapUp");44 return false;45 }46 47 // 滚动 48 @Override49 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,50 float distanceY) {51 Log.e("GestureActivity", "onScroll");52 return false;53 }54 55 // 长按 不松开56 @Override57 public void onLongPress(MotionEvent e) {58 Log.e("GestureActivity", "onLongPress");59 60 }61 62 // 快速滑动 并且松开 慢的话只有onScroll63 @Override64 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,65 float velocityY) {66 Log.e("GestureActivity", "onFling" );67 //右翻68 if((e2.getX()-e1.getX()>X_MOVE_INSTANCE)&&velocityX>X_MOVE_SPEED){69 70 imageView.setImageResource(images[++position%images.length]);71 }else //左翻72 if((e1.getX()-e2.getX()>X_MOVE_INSTANCE)&&Math.abs(velocityX)>X_MOVE_SPEED){73 74 imageView.setImageResource(images[++position%images.length]);75 }76 77 78 return false;79 }80 }