我要一步一步往上爬——Android应用实例笔记(1)—手势
我要一步一步往上爬——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.- 一个手势就是一个在触摸屏幕的手写形状。它可以有一个或者多个笔画。每个笔画是由一些列的时序点构成。
?
一个用户自定义的手势可以被GestureLibrary 识别,或者字母手势可以被内置的字符识别器( LetterRecognizer)识别
?
GestureLibrary
用于添加存储获取Getsture的管理容器。通常由GestureLibraries的如下4个方法来获得,
?
?
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) {
??????? }
??? }
}
?
?
?