Android手势源码浅析------手势的形成(Gesture)
来源:互联网 发布:windows sudo rm -rf 编辑:程序博客网 时间:2024/04/30 08:33
前言:上篇介绍了提供手势绘制的视图平台GestureOverlayView,但是在视图平台上绘制出的手势,是需要存储以及在必要的利用时加载取出手势。所以,用户绘制出的一个完整的手势是需要一定的代码机制来完成存储以及必要时加载取出的;那么,在源码中Gesture这个类就是用来描述完整的手势的。一个Gesture就是用户手指在触摸屏上绘制形成的不规则几何图形(A gesture is a hand-drawn shape on a touch screen);
一. Gesture的组成
通过前篇文章<<Android手势源码浅析-----手势绘制(GestureOverlayView)>>的介绍,我们知道,当我们在GestureOverlayView上绘制手势时,形成的不规则几何图形是由多数个点形成的,这些点都有其对应的在屏幕上的坐标值和时间戳(event.getEventTime());那么,这些点是如何组成Gesture的呢?针对这个问题,通过对Android手势源码的浅析来寻求答案;
下图总体上大概描述了Gesture的形成结构,如下:
从上图描述的类关系中,可以知道:
1. 触摸屏上的点首先是通过GesturePoint这个类来描述的,GesturePoint封装点的x,y轴值和时间戳。
2. GesturePoint中封装的点的信息会在GestureStroke类中被拆解处理,点对应的x,y值被拆解存放在GestureStroke的float类型数组成员points中,而点对应的时间戳则放在long类型成员数组timestamps中。
3. GestureStroke表示一个手势行程(用户手指点下屏幕到手势离开屏幕绘制出的轨迹就是一个手势行程)。一个完整的手势由一个或多个手势行程组成(单笔画或多笔画绘制手势)
4. Gesture由单个或多个GestureStroke组成,Gesture类中的mStrokeBuffer成员为ArrayList类型集合,存放的是GestureStroke;
二. Gesture的形成过程:
当我们在GestureOverlayView上绘制手势时,会调用GestureOverlayView的touchDown、touchMove、touchUp方法,然后将通过这个三个方法捕获到的形成手势的多数个点组成Gesture。如下代码:
- public class GestureOverlayView extends FrameLayout {
- ...
- private void touchDown(MotionEvent event) {
- ...
- mStrokeBuffer.add(new GesturePoint(x, y, event.getEventTime()));
- ...
- }
- private Rect touchMove(MotionEvent event) {
- ...
- mStrokeBuffer.add(new GesturePoint(x, y, event.getEventTime()));
- ...
- }
- private void touchUp(MotionEvent event, boolean cancel) {
- ...
- mCurrentGesture.addStroke(new GestureStroke(mStrokeBuffer));
- ...
- }
- ...
- }
GesturePoint的源代码如下:
- /*
- * Copyright (C) 2008-2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package android.gesture;
- import java.io.DataInputStream;
- import java.io.IOException;
- /**
- * A timed point of a gesture stroke. Multiple points form a stroke.
- */
- //一个手势行程的定时点,多个点形成一个手势行程。GesturePoint封装x,y轴和时间戳的值
- public class GesturePoint {
- public final float x;
- public final float y;
- public final long timestamp;
- public GesturePoint(float x, float y, long t) {
- this.x = x;
- this.y = y;
- timestamp = t;
- }
- //从输入流中读取之前保存在文件中的数据
- static GesturePoint deserialize(DataInputStream in) throws IOException {
- // Read X and Y
- final float x = in.readFloat(); //从输入流中读出对应x轴的坐标值 (来自通过调用GestureStroke的函数serialize保存的,下同)
- final float y = in.readFloat(); //从输入流中读出对应y轴的坐标值
- // Read timestamp
- final long timeStamp = in.readLong(); //从输入流中读出对应的时间戳
- return new GesturePoint(x, y, timeStamp);
- }
- @Override
- public Object clone() {
- return new GesturePoint(x, y, timestamp);
- }
- }
---->紧接着,当用户完成手势绘制手指离开屏幕时,会调用touchUp,执行 mCurrentGesture.addStroke(new GestureStroke(mStrokeBuffer)),实现将之前绘制手势得到的mStrokeBuffer集合作为GestureStroke构造函数的实参创建GestureStroke对象,然后将GestureStroke对象作为mCurrentGesture(Gesture对象)的方法addStroke的实参,实现将GestureStroke添加到Gesture中;
GesturePoint的部分源代码如下:
- /**
- * A gesture stroke started on a touch down and ended on a touch up. A stroke
- * consists of a sequence of timed points. One or multiple strokes form a gesture.
- */
- public class GestureStroke {
- ...
- public final float length; //length为手势行程的长度
- public final float[] points; //保存组成手势行程的多数个点的x,y坐标值
- private final long[] timestamps;//保存组成手势行程的多数个点的时间戳
- /**
- * A constructor that constructs a gesture stroke from a list of gesture points.
- *
- * @param points
- */
- public GestureStroke(ArrayList<GesturePoint> points) {
- final int count = points.size();
- final float[] tmpPoints = new float[count * 2];
- final long[] times = new long[count];
- RectF bx = null;
- float len = 0;
- int index = 0;
- for (int i = 0; i < count; i++) {
- final GesturePoint p = points.get(i);
- tmpPoints[i * 2] = p.x; //偶数位置保存x值
- tmpPoints[i * 2 + 1] = p.y; //奇数位置保存x值
- times[index] = p.timestamp;
- if (bx == null) {
- bx = new RectF();
- bx.top = p.y;
- bx.left = p.x;
- bx.right = p.x;
- bx.bottom = p.y;
- len = 0;
- } else {
- //Math.pow(a,b)为a的b次方,如Maht.pow(3,2)等于9。下面的公式相当于平方和的根号值
- len += Math.sqrt(Math.pow(p.x - tmpPoints[(i - 1) * 2], 2)
- + Math.pow(p.y - tmpPoints[(i -1 ) * 2 + 1], 2));
- //放大bx覆盖到指定的p.x, p.y点
- bx.union(p.x, p.y);
- }
- index++;
- }
- timestamps = times;
- this.points = tmpPoints;
- boundingBox = bx;
- length = len;
- }
- ...
- }
---->接着,将创建得到的GestureStroke对象通过调用Gesture的addStroke方法添加到Gesture类的mStrokes中,Gesture的addStroke方法源码实现如下:
- /**
- * A gesture is a hand-drawn shape on a touch screen. It can have one or multiple strokes.
- * Each stroke is a sequence of timed points. A user-defined gesture can be recognized by
- * a GestureLibrary.
- */
- /*手势时是触摸屏上手势绘制的形状,它可以单笔画或者多笔画,
- * 每一个笔画是一个计时点序列,用户绘制定义的手势可以通过GestureLibrary来识别
- */
- public class Gesture implements Parcelable {
- ...
- private final ArrayList<GestureStroke> mStrokes = new ArrayList<GestureStroke>();
- ...
- /**
- * Adds a stroke to the gesture.
- *
- * @param stroke
- */
- public void addStroke(GestureStroke stroke) {
- mStrokes.add(stroke);
- ...
- }
- ...
- ...
- }
最后,针对手势组成类之间的关系进行一个小结:
1). GesturePoint: 描述用户手指在屏幕位置的一个定时点,封装用户手指在屏幕上的点坐标值以及时间戳,时间戳由event.getEventTime()决定。
2). GestureStroke:描述用户手指在屏幕上滑动到手指离开屏幕时所产生的轨迹线(由多个时间序列点形成),一个GestureStroke由多个GesturePoint组成。
3). Gesture:实现Parcelable接口,描述用户完成绘制的完整手势,一个Gesture由单个或多个GestureStroke组成。手势绘制可通过GestureOverlayView.setGestureStrokeType(inttype)来设置单笔和多笔画。
- Android手势源码浅析------手势的形成(Gesture)
- Android手势源码浅析------手势的形成(Gesture)
- Android手势源码浅析------手势的形成(Gesture)
- 手势绘制(GestureOverlayView)、手势的形成(Gesture)、手势的保存和加载(GestureLibrary)、手势识别的源码解析
- gesture--Android手势的使用
- Android手势源码浅析-----手势的保存和加载(GestureLibrary)
- Android手势源码浅析-----手势的保存和加载(GestureLibrary)
- android手势Gesture识别
- Android手势Gesture详解、、、
- Android 手势(Gesture)
- 简述 Android 手势(Gesture)
- Android 手势(Gesture)
- android --手势Gesture
- Android手势(Gesture)
- Android手势源码浅析-----手势绘制(GestureOverlayView)
- Android手势源码浅析----手势识别
- Android手势源码浅析-----手势绘制(GestureOverlayView)
- Android手势源码浅析-----手势绘制(GestureOverlayView)
- 山东省第四届 A Rescue The Princess
- 转载:HTTP和HTTPS详解
- Android面试题汇总:
- Linux下查看某程序的端口占用情况
- OpenCV学习笔记之八(保存视频,录制视频,cvLoadImage的路径)
- Android手势源码浅析------手势的形成(Gesture)
- Picasso源码解析之Lrucache算法源码解析
- 取石子
- Machine Learning MultiLinear Regression Andrew Ng 课程练习 Matlab Script 详细解析
- java实现条件编译
- 《Java程序设计基础》 第8章手记Part 1
- C++ 单位整型计算器,仅支持带括号的四则运算。初学c++第一个个人作品
- 第二季:在UEFI+GPT模式下用U安装系统
- EditText限制输入的小数点只能一个