andorid中手机交互的执行过程android
1.手指触碰屏幕,触发MotionEvent事件api
2.该事件能够被onTouchListener监听ide
3.经过 GestureDetector(该类是手势的一个封装类)转发咱们的手指触碰事件给OnGestureListener布局
4.在监听值执行相应的逻辑测试
OnGestureListener中提供的方法:ui
//就是触碰的那一刹那
@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对象 两个参数,一个上下文,一个监听器this
GestureDetecto xx = new GestureDetecto(Context context,OnGestureListener, onGestureListener)spa
step2:在触碰事件监听类中,将触碰事件交给咱们的GestureDetector处理code
public boolean onTouchEvent(MotionEvent event) { return mDetector.onTouchEvent(event); }orm
我么会发现,若是咱们要实现设置某一个事件的逻辑,须要实现这么多的事件,显然这不合理,固然官方也为咱们提供了SimpleOnGestureListener至关于一个已经实现方法的类,
咱们只须要重写咱们想实现的方法便可。
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
这里咱们主要讲一下咱们自定义的手势该如何的去使用
其实咱们的思路很简单,就是从画一个手势,而后与手势库中的手势进行一个比对,比对他们的一个类似度。
首先获取指定位置的手势库,而后经过public ArrayList recognize (Gesture gesture): 从当前手势库中识别与gesture匹配的所有手势。
注意返回的是一个匹配手势的ArrayList<Prediction>集合 Prediction的socre能够决定匹配的匹配度是多少,他还封装了一个name属性表示手势的名字。
注意: gesture.toBitmap() 是一个手势转换位图的方法。