Android-自定义手势识别-复杂手势识别

一、概述

1、手势交互过程(原理)

1)触屏一刹那,触发MotionEvent事件

2)被OnTounchListener监听,在onTouch()中获得MotionEvent对象

3GestureDetector转发MotionEvent对象至OnGestureListener.

 

2MotionEvent:

1)用于封装手势、触摸笔、规则球等动作事件

2)内部封装用于记录横轴和纵轴坐标的属性XY

 

3GestureDetector

1)识别各种手势

2)触摸屏:按下、移动、抬起等

<1>重载onTouch或者设置setOnTouchListener

3)工作原理:

<1>当接收到用户触摸消息时,将消息交给GestureDetector加工

<2>通过设置监听器获得GestureDetector处理后的手势

4、监听器:

OnGestureListener:处理单击类消息

单击:onDown(MotionEvent e)

抬起:onSingleTapUp(MotionEvent e)

短按:onShowPress(MotionEvent e)

长按:onLongPress(MotionEvent e)

滚动;onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)

滑动:onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)

 

OnDoubleTapListener:处理双击类消息

双击:onDoubleTap(MotionEvent e)

双击按下和抬起各触发一次:onDoubleTapEvent(MotionEvent e)

单击确认:onSingleTapConfirmed(MotionEvent e)

 

5GestureOverlayView:

一种用于手势输入的透明覆盖层,可覆盖在其他控件的上方,也可包含其他控件。存在3个监听器接口:

GestureOverlayView.OnGestureListener               手势监听器

GestureOverlayView.OnGesturePerformedListener   手势执行监听器

GestureOverlayView.OnGesturingListener        手势执行中监听器

 

一些常见的XML属性设置:

android:eventsInterceptionEnabled 当手势已经被识别出来时,是否拦截该手势动作

android:fadeDuration  当用户画完手势效果淡出的时间

android:fadeEnabled  用户画完之后手势是否自动淡出

android:gestureColor=”#000000”  手势的颜色

android:gestureStrokeType=”multiple”  笔画的类型

android:gestureStrokeWidth=”2dp”  笔画的粗细

 

使用步骤:

1)使用Gesture Builder 应用程序生成手势文件

2)导入生成的手势文件

3)匹配识别手势

 

二、简单手势GestureDetector的使用

<pre name="code" class="java"><span style="font-size:18px;">package com.sqb.demo8;
import com.sqb.app_im3.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.Toast;
 
public class Activity8Gesture extends Activity{
	private ImageView img;
	private GestureDetector myGestureDetector;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout8gesture);
		img = (ImageView) findViewById(R.id.iv8_1);
		//myGestureDetector = new GestureDetector(new myGestureListener());//过时了
		myGestureDetector = new GestureDetector(this,new myGestureListener());
		img.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// TODO Auto-generated method stub
				myGestureDetector.onTouchEvent(event);
				return true;
			}
		});
	}
	class myGestureListener extends SimpleOnGestureListener{
		@Override
		public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
					float velocityY) {
			if(e1.getX()-e2.getX() >50){
				Toast.makeText(Activity8Gesture.this, "从右向左滑", Toast.LENGTH_SHORT).show();
			}else if(e2.getX()- e1.getX() >50){
				Toast.makeText(Activity8Gesture.this, "从左向右滑", Toast.LENGTH_SHORT).show();
			}
			return super.onFling(e1, e2, velocityX, velocityY);
		}
	}
}</span>


 

三、复杂手势GestureOverlayView的使用

1、在Eclipse创建内置的simple demo

1File-->new-->Other-->Android-->Android Sample Project-->Build Target 2.3.3也行-->GestureBuilder,然后Eclipse里面就多了一个GestureBuilder项目了,把项目运行到虚拟机上。







2、创建手势文件并导入到新的项目中:

1)打开模拟器,打开刚才从Eclipse编译安装的Gesture Builder软件


2)点击Add gesture新建手势




3)将手势识别库从sdcard卡中导出,在res文件下新建raw文件,将导出的gesture文件粘贴到raw文件下



3、编写代码:

(1)Activity类:

package com.sqb.demo8;

import java.util.ArrayList;
import com.sqb.app_im3.R;
import android.app.Activity;
import android.gesture.Gesture;
import android.gesture.GestureLibraries;
import android.gesture.GestureLibrary;
import android.gesture.GestureOverlayView;
import android.gesture.GestureOverlayView.OnGesturePerformedListener;
import android.gesture.Prediction;
import android.os.Bundle;
import android.widget.Toast;

public class Activity8GestureOverlayView extends Activity{
	    private GestureOverlayView gov;  
	    private GestureLibrary gl;  
	    /** Called when the activity is first created. */  
	    @Override  
	    public void onCreate(Bundle savedInstanceState) {  
	        super.onCreate(savedInstanceState);  
	        setContentView(R.layout.layout8gestureoverlayview);  
	        //从资源文件中将手势库加载进来  
	        gl = GestureLibraries.fromRawResource(this, R.raw.gestures);  
	        gl.load();  
	        //从xml中取出GestureOverlayView控件  
	        gov = (GestureOverlayView) findViewById(R.id.gestureOverlayView1);  
	        //为GestureOverlayView控件添加监听  
	        gov.addOnGesturePerformedListener(new OnGesturePerformedListener() {  
	            @Override  
	            public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {  
	                //识别手势,返回一个类型为Prediction的列表  
	                ArrayList<Prediction> list = gl.recognize(gesture);  
	                Prediction pre = list.get(0);  
	                //如果匹配度大于1,表示可以识别,否则提示无法识别   
	                if(pre.score > 1){  
	                    //判断名字是否与手势库的名字相同  
	                    if(pre.name.equals("haha")){  
	                        Toast.makeText(Activity8GestureOverlayView.this, "Recognize the haha", Toast.LENGTH_SHORT).show();  
	                    }else if(pre.name.equals("xin")){  
	                        Toast.makeText(Activity8GestureOverlayView.this, "Recognize the xin", Toast.LENGTH_SHORT).show();  
	                    }  
	                }else{  
	                    Toast.makeText(Activity8GestureOverlayView.this, "Can't Recognize", Toast.LENGTH_SHORT).show();  
	                }  
	            }
	        });  
	    }  
	}  

(2)XML文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
	<android.gesture.GestureOverlayView  
        android:id="@+id/gestureOverlayView1"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent" >  
    </android.gesture.GestureOverlayView>  
</LinearLayout>

参考资料:

GestureOverlayView手势识别:http://blog.csdn.net/zlqqhs/article/details/8541507



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值