Android 手势(Gesture)
2015-07-13 23:26
477 查看
一、什么是手势?
所谓手势,其实就是指用户手指或触摸笔在触摸屏上的连续触碰行为,比如在屏幕上葱左至右划出一个动作,就是手势,再比如在屏幕上画一个圆圈也是一个手势,手势这种连续的触碰会形成某个方向上的移动趋势,也会形成一个不规则的几何图形。Android对两种手势行为都提供了支持:
1、对于第一种手势行为而言,Android提供了手势检测,并为手势检测提供了相应的监听器。
2、对于第二种手势行为,Android允许开发者添加手势,并提供了相应的API识别用户手势
二、手势检测
Android为手势检测提供了一个GestureDetector类,GestureDetector实例代表了一个手势检测器,创建GestureDetector时需要传入一个GestureDetector.OnGestureListener监听器,负责对用户的手势行为提供响应。
GestureListener包含的事件处理方法如下:
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):用户在触摸屏上的轻击事件将会出发该方法
以下代码演示了,在什么条件下触发什么手势,触发顺序
下面是通过Fling方法进行的一个滑动监听仿的类似ViewPager
三、手势识别库
Android 手势除了提供手势检测之外,还允许应用程序吧用户手势(多个持续的触摸事件在屏幕种形成特定的形状)添加到指定文件夹中,以备以后使用——如果程序需要,当用户下次画出该手势时,系统可识别该手势。
Android使用GestureLibrary来代表手势哭,并提供了GestureLibraries工具类来创建手势库,GestureLibraries提供了如下4个静态方法从不同位置加载手势库。
static GestureLibrary fromFile(String path):
static GestureLibrary fromFile(File path):
static GestureLibrary fromPrivateResource(Context context,int resourceID):从资源库中加载手势
当用户获取GestureLibrary 对象之后,该对象提供来如下方法来添加手势、识别手势。
void addGesture(String entryName,Gesture gesture):添加一个名为entryName的手势。
Set<String> getGestrueEntries():获取该手势哭肿的所有手势名称。
ArrayList<Gesture> getGestures(String entryName):获取entryName名称对应的全部手势。
ArrayList<Prediction> recognize(Gesture gesture):从当前手势库中识别与gesture匹配的全部手势。
————Prediction:name属性表示匹配手势名
————Prediction:score属性表示了手势相似度
void removeEntry(String entryName):删除手势库中识别的entryName对应的手势
void removeGesture(String entryName,Gesture gestrue):删除手势库中entryName、gesture对应的手势
boolean save():当手势库中添加手势或从删除手势后调用改方法来保存手势库
手势绘制与比对
Android 提供了一个手势编辑组件:GestureOverlayView,该组件就像一个"绘图组件",只是用户绘制的是手势,不是图形。
为了监听GestureOverlayView Android提供了OnGestureListener、OnGesturePerformedListener、OnGesturingListener三个监听器,分别用于监听手势事件的开始、结束、完成、取消等事件,一般最常用多是OnGesturePerformedListener,用于提供完成时响应
所谓手势,其实就是指用户手指或触摸笔在触摸屏上的连续触碰行为,比如在屏幕上葱左至右划出一个动作,就是手势,再比如在屏幕上画一个圆圈也是一个手势,手势这种连续的触碰会形成某个方向上的移动趋势,也会形成一个不规则的几何图形。Android对两种手势行为都提供了支持:
1、对于第一种手势行为而言,Android提供了手势检测,并为手势检测提供了相应的监听器。
2、对于第二种手势行为,Android允许开发者添加手势,并提供了相应的API识别用户手势
二、手势检测
Android为手势检测提供了一个GestureDetector类,GestureDetector实例代表了一个手势检测器,创建GestureDetector时需要传入一个GestureDetector.OnGestureListener监听器,负责对用户的手势行为提供响应。
GestureListener包含的事件处理方法如下:
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):用户在触摸屏上的轻击事件将会出发该方法
以下代码演示了,在什么条件下触发什么手势,触发顺序
public class MainActivity extends Activity implements GestureDetector.OnGestureListener{ private static final String TAG="TAG"; private GestureDetector detector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); detector = new GestureDetector(this,this); } /** * 添加手势 * @param event * @return */ @Override public boolean onTouchEvent(MotionEvent event) { return detector.onTouchEvent(event); } /** * 按下时 * @param e * @return */ @Override public boolean onDown(MotionEvent e) { Log.i(TAG,"detector onDown"); return false; } /** * 按下未移动时 * @param e */ @Override public void onShowPress(MotionEvent e) { Log.i(TAG,"detector onShowPress"); } /** * 轻击事件 * @param e * @return */ @Override public boolean onSingleTapUp(MotionEvent e) { Log.i(TAG,"detector onSingleTapUp"); return false; } /** * 滚动时 * @param e1 * @param e2 * @param distanceX * @param distanceY * @return */ @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.i(TAG,"detector onScroll"); return false; } /** * 长按时 * @param e */ @Override public void onLongPress(MotionEvent e) { Log.i(TAG,"detector onLongPress"); } /** * 快速滑动时 * @param e1 * @param e2 * @param velocityX * @param velocityY * @return */ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.i(TAG,"detector onFling"); return false; } }
下面是通过Fling方法进行的一个滑动监听仿的类似ViewPager
public class MainActivity3 extends Activity implements GestureDetector.OnGestureListener{ private static final String TAG="TAG"; private GestureDetector detector; private ViewFlipper mFlipper; private Animation[] animations = new Animation[4]; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gesture); detector = new GestureDetector(this,this); mFlipper = (ViewFlipper) findViewById(R.id.flipper); mFlipper.addView(addImageView(R.mipmap.image)); mFlipper.addView(addImageView(R.mipmap.image2)); mFlipper.addView(addImageView(R.mipmap.image3)); mFlipper.addView(addImageView(R.mipmap.image4)); animations[0] = AnimationUtils.loadAnimation(this,R.anim.left_in); animations[1] = AnimationUtils.loadAnimation(this,R.anim.left_out); animations[2] = AnimationUtils.loadAnimation(this,R.anim.right_in); animations[3] = AnimationUtils.loadAnimation(this,R.anim.right_out); } private ImageView addImageView(int resId){ ImageView imageView = new ImageView(this); imageView.setImageResource(resId); imageView.setScaleType(ImageView.ScaleType.CENTER); return imageView; } /** * 添加手势 * @param event * @return */ @Override public boolean onTouchEvent(MotionEvent event) { return detector.onTouchEvent(event); } /** * 按下时 * @param e * @return */ @Override public boolean onDown(MotionEvent e) { Log.i(TAG,"detector onDown"); return false; } /** * 按下未移动时 * @param e */ @Override public void onShowPress(MotionEvent e) { Log.i(TAG,"detector onShowPress"); } /** * 轻击事件 * @param e * @return */ @Override public boolean onSingleTapUp(MotionEvent e) { Log.i(TAG,"detector onSingleTapUp"); return false; } /** * 滚动时 * @param e1 * @param e2 * @param distanceX * @param distanceY * @return */ @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.i(TAG,"detector onScroll"); return false; } /** * 长按时 * @param e */ @Override public void onLongPress(MotionEvent e) { Log.i(TAG,"detector onLongPress"); } private final int FLIP_DISTANCE = 50; /** * 快速滑动时 * @param e1 * @param e2 * @param velocityX * @param velocityY * @return */ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.i(TAG, "detector onFling"); if(e1.getX()-e2.getX()>FLIP_DISTANCE){ mFlipper.setInAnimation(animations[2]); mFlipper.setOutAnimation(animations[1]); mFlipper.showNext(); return true; }else if(e2.getX()-e1.getX()>FLIP_DISTANCE){ mFlipper.setInAnimation(animations[0]); mFlipper.setOutAnimation(animations[3]); mFlipper.showPrevious(); return true; } return false; }
三、手势识别库
Android 手势除了提供手势检测之外,还允许应用程序吧用户手势(多个持续的触摸事件在屏幕种形成特定的形状)添加到指定文件夹中,以备以后使用——如果程序需要,当用户下次画出该手势时,系统可识别该手势。
Android使用GestureLibrary来代表手势哭,并提供了GestureLibraries工具类来创建手势库,GestureLibraries提供了如下4个静态方法从不同位置加载手势库。
static GestureLibrary fromFile(String path):
static GestureLibrary fromFile(File path):
static GestureLibrary fromPrivateResource(Context context,int resourceID):从资源库中加载手势
当用户获取GestureLibrary 对象之后,该对象提供来如下方法来添加手势、识别手势。
void addGesture(String entryName,Gesture gesture):添加一个名为entryName的手势。
Set<String> getGestrueEntries():获取该手势哭肿的所有手势名称。
ArrayList<Gesture> getGestures(String entryName):获取entryName名称对应的全部手势。
ArrayList<Prediction> recognize(Gesture gesture):从当前手势库中识别与gesture匹配的全部手势。
————Prediction:name属性表示匹配手势名
————Prediction:score属性表示了手势相似度
void removeEntry(String entryName):删除手势库中识别的entryName对应的手势
void removeGesture(String entryName,Gesture gestrue):删除手势库中entryName、gesture对应的手势
boolean save():当手势库中添加手势或从删除手势后调用改方法来保存手势库
手势绘制与比对
Android 提供了一个手势编辑组件:GestureOverlayView,该组件就像一个"绘图组件",只是用户绘制的是手势,不是图形。
为了监听GestureOverlayView Android提供了OnGestureListener、OnGesturePerformedListener、OnGesturingListener三个监听器,分别用于监听手势事件的开始、结束、完成、取消等事件,一般最常用多是OnGesturePerformedListener,用于提供完成时响应
public class MainActivity4 extends Activity{ private GestureOverlayView mOverlay; private ImageView mShowGesture; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gesture2); //获取绘制手势组件 mOverlay = (GestureOverlayView) findViewById(R.id.gesture_overlay); //获取绘制后显示组件 mShowGesture = (ImageView) findViewById(R.id.show_gesture); //添加绘制后监听 mOverlay.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() { @Override public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { //将手势转换为图片 Bitmap bitmap = gesture.toBitmap(128, 128, 10, 0xffff0000); mShowGesture.setImageBitmap(bitmap); //获取手势库 GestureLibrary gestureLibrary = GestureLibraries.fromFile("/mnt/sdcard/gestures"); //判断手势库是否加载 if (gestureLibrary.load()) { Toast.makeText(MainActivity4.this, "手势文件已经装载", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity4.this, "手势文件装载失败", Toast.LENGTH_SHORT).show(); } //获取所有相似的手势 ArrayList<Prediction> recognizes = gestureLibrary.recognize(gesture); Toast.makeText(MainActivity4.this, "手势数量:" + recognizes.size(), Toast.LENGTH_SHORT).show(); //遍历相似的手势,相似度高于5的才打印 for (Prediction recognize : recognizes) { if (recognize.score > 5.0) { Toast.makeText(MainActivity4.this, "手势名称:" + recognize.name + " 相似度:" + recognize.score, Toast.LENGTH_SHORT).show(); } } //添加手势 (手势名称,手势) gestureLibrary.addGesture("gesture", gesture); //保存手势 gestureLibrary.save(); } }); } }
相关文章推荐
- android简易双屏支持
- Android中的优化问题
- Android性能优化--Layout优化篇
- Android四大组件之Activity .
- Android 关于Service的一个很好的简介
- android双屏显示的一些修改与尝试
- FragmentStatePagerAdapter第二次加载时不能显示其界面的原因及解决办法
- Android平台根目录文件
- Android开发之监听手机来电
- Android开发之一分钟教你使用双向滑动菜单
- android 自定义TextView删除线
- Android自定义圆形图片按钮
- Android组件的布局属性
- Android 输入管理服务-输入事件到达之后的处理流程
- Android RecyclerView 使用完全解析 体验艺术般的控件
- [android API 学习]View 的getLeft(),getX()和getTranslationX()
- android开发环境搭建(for 驱动开发人员)
- android launcher
- Android学习笔记(十)
- android ExpandableListView二级列表