Android-手势识别

 1.常用手势

         andorid中手机交互的执行过程

                   1.手指触碰屏幕,触发MotionEvent事件

                   2.该事件可以被onTouchListener监听

                   3.通过 GestureDetector(该类是手势的一个封装类)转发我们的手指触碰事件给OnGestureListener

                   4.在监听值执行相应的逻辑

 

  1.  MotionEvent  是一个封装了触碰,触摸笔等的动作事件,包含两个重要的变量x,y
  2. GestureDetector 就是一个识别手势的封装类
  3. OnGestureListener手势的监听接口,GestureDetector中识别到手势就会触发相应的监听事件。

  OnGestureListener中提供的方法:

                      

      //就是触碰的那一刹那
    @Override
public boolean onDown(MotionEvent e) { return false; }      //手指按在触摸屏上 其实就是一刹那 -- 长按 之间那一段 @Override public void onShowPress(MotionEvent e) { } //手指离开触目屏那一刹那 @Override public boolean onSingleTapUp(MotionEvent e) { return false; }      //手指在触摸屏上滑动 @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; }      //也就是我们所说的长按 @Override public void onLongPress(MotionEvent e) { }     //手指在触摸屏上迅速挪动并且抛开,其实就是下拉,侧滑等等 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; }

 

     如何实现简单的手势测试呢:

                            step1:创建GestureDetector对象 两个参数,一个上下文,一个监听器

            GestureDetecto xx = new GestureDetecto(Context context,OnGestureListener, onGestureListener)

                            step2:在触碰事件监听类中,将触碰事件交给我们的GestureDetector处理

                                                    public boolean onTouchEvent(MotionEvent event) { return mDetector.onTouchEvent(event); }

   

       我么会发现,如果我们要实现设置某一个事件的逻辑,需要实现这么多的事件,显然这不合理,当然官方也为我们提供了SimpleOnGestureListener相当于一个已经实现方法的类,

 我们只需要重写我们想实现的方法即可。

2.创建手势

                android还为我们提供了自定义的手势的添加和使用:

      首先我们来了了解几个类

              1.GestureLibraries  可以看出这是一个手势库的意思,没错我们可以保存我们自定义的手势到我们的手机中。

                      构造方法:

                  static GestureLibrariey fromFile(File file)//指定文件 后边也可以是中的String 文件目录,还有其他的构造方法,大家查阅相应的api即可

                    

 

                常用的API:

  • public void addGesture (String entryName, Gesture gesture):添加一个名为entryName的手势
  • public Set getGestureEntries ():获得手势库中所有手势的名称
  • public ArrayList getGestures (String entryName):获得entryName名称对应的全部手势
  • public ArrayList recognize (Gesture gesture): 从当前手势库中识别与gesture匹配的全部手势
  • public void removeEntry (String entryName):删除手势库中entryName名称对应的手势
  • public void removeGesture (String entryName, Gesture gesture):删除手势库中entryName和gesture都匹配的手势
  • public abstract boolean save ():想手势库中添加手势或从中删除手势后调用该方法保存手势库

 

                                        2.GestureOverlayView手势编辑组件:这是一个手势手编写组件,可以使用他来创建一个手势,然后将手势通过GestureLibraries保存到本地即可

              

              主要是提供了三种监听接口一旦我们的手势完成就会调用我们的相应方法,保存手势即可


            

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
      //首先我们设置我们的 手势组件 gestureOverlayView
= (GestureOverlayView)findViewById(R.id.gesture);
//设置颜色,画笔的宽度 gestureOverlayView.setGestureColor(Color.RED); gestureOverlayView.setGestureStrokeWidth(
5);
       //为我们的手势控件添加监听方法,如果手势完成,就调用其中的监听方法 gestureOverlayView.addOnGesturePerformedListener(
new GestureOverlayView.OnGesturePerformedListener() { @Override public void onGesturePerformed(GestureOverlayView overlay, final Gesture gesture) {
//通过打气筒 获取我们的layout 三个参数 第一个参数就是要获取layout的id 第二个是指定一个view的外边布局,第三个参数如果为false则布局加到view上返回的是我们呢的view,如果是true则返回第二个参数布局 View view
= MainActivity.this.getLayoutInflater().inflate(R.layout.layout, null, false); final EditText editText = (EditText)view.findViewById(R.id.text); ImageView imageView = (ImageView)view.findViewById(R.id.image); //将手势转换成为位图 Bitmap bitmap = gesture.toBitmap(528, 528, 10, 0xffff0000);
           //设置我们的位图 imageView.setImageBitmap(bitmap);
new AlertDialog.Builder(MainActivity.this).setView(view).setPositiveButton("保存", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) {
                //获取sd卡的路径 File file
= new File(Environment.getExternalStorageDirectory(),"mnt/sdcard/testGesture"); //创建保存目录 gestureLibrary = GestureLibraries.fromFile(file);                   //添加手势到文件中保存文件 gestureLibrary.addGesture(editText.getText().toString().trim(),gesture); gestureLibrary.save(); } }).setNegativeButton("取消", null).show(); } });

 

在layout中设置手势组件GestureOverlayView,然后设置手势完成的监听方法,创建GestureLibrary 手势库,然后通过addGesture中添加一个手势,

别忘了通过save方法保存我们的手势o

                     

 3.手势判断

  这里我们主要讲一下我们自定义的手势该如何的去使用

  其实我们的思路很简单,就是从画一个手势,然后与手势库中的手势进行一个比对,比对他们的一个相似度。

      首先获取指定位置的手势库,然后通过public ArrayList recognize (Gesture gesture): 从当前手势库中识别与gesture匹配的全部手势。

    注意返回的是一个匹配手势的ArrayList<Prediction>集合 Prediction的socre可以决定匹配的匹配度是多少,他还封装了一个name属性表示手势的名字。

 

 

注意: gesture.toBitmap() 是一个手势转换位图的方法。

posted @ 2018-01-12 17:49  hhua  阅读(3460)  评论(0编辑  收藏  举报