android 手势
前言: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布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <ImageView android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" > </ImageView> </LinearLayout>
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 @Override 11 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 @Override 22 public boolean onTouchEvent(MotionEvent event) { 23 return gestureDetector.onTouchEvent(event); 24 } 25 26 //按下的时候触发 27 @Override 28 public boolean onDown(MotionEvent e) { 29 Log.e("GestureActivity", "onDown--"+e.getAction()); 30 return false; 31 } 32 33 //按住 且为达到onLongPress之前 调用 一旦调用就不会有onSingleTapUp 34 @Override 35 public void onShowPress(MotionEvent e) { 36 Log.e("GestureActivity", "onShowPress"); 37 38 } 39 40 // 离开屏幕的一刹那 41 @Override 42 public boolean onSingleTapUp(MotionEvent e) { 43 Log.e("GestureActivity", "onSingleTapUp"); 44 return false; 45 } 46 47 // 滚动 48 @Override 49 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 50 float distanceY) { 51 Log.e("GestureActivity", "onScroll"); 52 return false; 53 } 54 55 // 长按 不松开 56 @Override 57 public void onLongPress(MotionEvent e) { 58 Log.e("GestureActivity", "onLongPress"); 59 60 } 61 62 // 快速滑动 并且松开 慢的话只有onScroll 63 @Override 64 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 }