我要一步一步往上爬——Android应用实例笔记(1)

源程序来自APIDemo的GestureBuilder

  • 相关的类

Gesture

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 and a built-in alphabet gesture can be recognized by a LetterRecognizer.   
   
  1. 一个手势就是一个在触摸屏幕的手写形状。它可以有一个或者多个笔画。每个笔画是由一些列的时序点构成。
     

一个用户自定义的手势可以被GestureLibrary 识别,或者字母手势可以被内置的字符识别器( LetterRecognizer)识别

 

GestureLibrary

用于添加存储获取Getsture的管理容器。通常由GestureLibraries的如下4个方法来获得,

static GestureLibrary fromFile(File path)
static GestureLibrary fromFile(String path)
static GestureLibrary fromPrivateFile(Context context, String name)
static GestureLibrary fromRawResource(Context context, int resourceId)

GestureOverLayView

GestureOverLayView,一个用于输入的透明层,它可以放到任何widget层上或者任何包含其他widget组件,即在最上层。

GestureOverLayView可以添加手势识别监听器:如下面

GestureOverlayView overlay = (GestureOverlayView) findViewById(R.id.gestures_overlay);
//添加手势识别监听器。
overlay.addOnGestureListener(new GesturesProcessor());

GestureOverlayView.OnGestureListener

用于监听手势,需要实现onGesture,onGestureEnded这两个方法

源程序注释:

public class CreateGestureActivity extends Activity {
private static final float LENGTH_THRESHOLD = 120.0f;

private Gesture mGesture;
private View mDoneButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.create_gesture);

mDoneButton = findViewById(R.id.done);
//GestureOverLayView,一个用于输入的透明层,它可以放到任何widget层上或者任何包含其他widget组件。
GestureOverlayView overlay = (GestureOverlayView) findViewById(R.id.gestures_overlay);
//添加手势识别监听器。
overlay.addOnGestureListener(new GesturesProcessor());
}

//用来检索存储每个对象实例化当前状态,在Activity被kill掉之前前被调用,可以被onCreate(Bundle) 或者 onRestoreInstanceState(Bundle) 调用恢复对象状态。

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);

if (mGesture != null) {
outState.putParcelable("gesture", mGesture);
}
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//恢复上一次手势
mGesture = savedInstanceState.getParcelable("gesture");
if (mGesture != null) {
final GestureOverlayView overlay =
(GestureOverlayView) findViewById(R.id.gestures_overlay);
overlay.post(new Runnable() {
public void run() {
overlay.setGesture(mGesture);
}
});

mDoneButton.setEnabled(true);
}
}

//添加手势
@SuppressWarnings({"UnusedDeclaration"})
public void addGesture(View v) {
if (mGesture != null) {
final TextView input = (TextView) findViewById(R.id.gesture_name);
final CharSequence name = input.getText();
if (name.length() == 0) {
input.setError(getString(R.string.error_missing_name));
return;
}

//GestureLibraries.fromFile(mStoreFile);GestureLibraries可以有多种方式构造GestureLibrary
//fromPrivateFile (Context context, String name)
//fromRawResource (Context context, int resourceId)
//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可以识别用户定义的手势
final GestureLibrary store = GestureBuilderActivity.getStore();
store.addGesture(name.toString(), mGesture);//将手势添加到自定义的手势库中,并保存
store.save();

setResult(RESULT_OK);

final String path = new File(Environment.getExternalStorageDirectory(),
"gestures").getAbsolutePath();
Toast.makeText(this, getString(R.string.save_success, path), Toast.LENGTH_LONG).show();
} else {
setResult(RESULT_CANCELED);
}

finish();

}

@SuppressWarnings({"UnusedDeclaration"})
public void cancelGesture(View v) {
setResult(RESULT_CANCELED);
finish();
}

//监听Gesture事件监听器,类似的还有OnGesturePerformedListener
//GestureOverlayView.OnGesturingListener,这个处理手势刚开始,和结束事件

private class GesturesProcessor implements GestureOverlayView.OnGestureListener {
public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) {
mDoneButton.setEnabled(false);
mGesture = null;
}

@Override
public void onGesture(GestureOverlayView overlay, MotionEvent event) {
}
@Override
public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {
mGesture = overlay.getGesture();

//这里过滤比较短的笔画或者曲线
if (mGesture.getLength() < LENGTH_THRESHOLD) {
overlay.clear(false);
}

//获得所有笔画
List<GestureStroke> strokes= mGesture.getStrokes();

for(GestureStroke stroke:strokes){
OrientedBoundingBox orientedBoundingBox=stroke.computeOrientedBoundingBox();
Path path = stroke.getPath();
path.setFillType(FillType.INVERSE_EVEN_ODD);//填充方式为奇偶填充。这个可以参见填充方式

for(float p:stroke.points){
System.out.print(p+' ');
}
}
mDoneButton.setEnabled(true);
}

public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) {
}
}
}

更多相关文章

  1. Android(安卓)手势
  2. Android自定义Listener
  3. Android(安卓)中文API (91) ―― GestureDetector
  4. 【Android(安卓)初学】2、View初步
  5. android上实现语音识别,基于google的语音识的简单例子.
  6. Android(安卓)人脸识别+人脸匹配(OpenCV+JavaCV)
  7. Android常用控件总结
  8. Android(安卓)轻松实现语音识别
  9. Android(安卓)滑动手势侦测方法介绍

随机推荐

  1. android编程铁定会碰到的问题 adb 出错 F
  2. Android 时间日期选择器的用法
  3. listview 通过筛选全部城市显示出搜索的
  4. Android 自动编译、打包生成apk文件 1 -
  5. 问题记录-Activity跳转后显示空白界面
  6. Android - Espresso -滚动到非列表视图项
  7. demo_代码注册广播接受者_Service
  8. 从零开始学android<popupwindow弹出式窗
  9. Android Services (后台服务)
  10. 面试之菜鸟吐槽技术总监