`

我要一步一步往上爬——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.

  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) {
        }
    }
}

 

 

 

分享到:
评论

相关推荐

    [单片机通信技术应用实例——基于STC15W系列单片机][周长锁,王旭][配套资料].rar

    《单片机通信技术应用实例——基于STC15W系列单片机》是一本深入探讨单片机通信技术的实践教程,由周长锁和王旭两位专家编写。本书聚焦于STC15W系列单片机,该系列是STC公司推出的一款高性能、低功耗的8051内核...

    安卓Android源码——多点触控实例源码.zip

    这个“安卓Android源码——多点触控实例源码.zip”压缩包包含了一个具体的多点触控应用的源代码,可以帮助开发者深入理解如何在Android应用中实现这一特性。 首先,我们需要了解多点触控的基本概念。多点触控...

    安卓Android源码——移动警务通实例.zip

    《安卓Android源码——移动警务通实例》是一个深入解析安卓应用程序开发的实例,它主要针对的是警务信息化领域,展示了如何利用Android平台构建高效、便捷的移动警务应用。在这个压缩包中,我们能找到一个完整的移动...

    Android源码——多点触控实例源码.zip

    总的来说,这个实例源码提供了一个实现Android多点触控功能的基础框架,可以帮助开发者深入理解多点触控的原理,并且能够自定义手势操作,为Android应用增加更多交互性。通过阅读和分析源代码,你可以了解到如何处理...

    《Google Android开发入门与实战》

    第7章 良好的学习开端——Android基本组件介绍之我的美丽我做主——Android中应用界面布局 第7章 良好的学习开端——Android基本组件介绍之不积跬步无以至千里——常用widget组件介绍 第7章 良好的学习开端——...

    Android手势识别——上下左右滑动、屏幕上下左右中区域处理

    在Android应用开发中,手势识别是一项重要的功能,它能让用户通过简单的触摸屏幕动作与应用程序进行交互。本篇文章将深入探讨如何实现上下左右滑动以及屏幕不同区域的特殊处理,为用户提供更加直观和丰富的操作体验...

    Android开发笔记——模拟器、应用教程 pdf

    总之,这份"Android开发笔记——模拟器、应用教程"将引导你全面了解Android开发的核心技术和实践方法,无论你是初学者还是经验丰富的开发者,都可以从中受益。通过学习和掌握这些知识点,你将能够创建出高质量、适应...

    [Android Studio应用开发——基础入门与应用实战][方欣,杨勃][电子课件]

    【Android Studio应用开发——基础入门与应用实战】是针对初学者和希望提升Android应用程序开发技能的人群设计的一门课程。这门课程由专家方欣和杨勃共同编写,旨在通过电子课件的形式,深入浅出地讲解Android ...

    Android源码——PathEffect效果实例源码_new_13.7z

    总结来说,PathEffect是Android图形绘制的重要工具,它可以给Path添加各种视觉效果,通过实例源码学习,我们可以深入理解其工作原理和应用场景,从而在UI设计上实现更多创新。对于Android开发者来说,掌握PathEffect...

    安卓Android源码——Android游戏源码——忍者快跑.zip

    在本压缩包“安卓Android源码——Android游戏源码——忍者快跑.zip”中,包含的是一个基于Android平台的游戏应用源代码,名为“忍者快跑”。这个游戏源码是学习和研究Android游戏开发的理想资源,它能帮助开发者深入...

    Android 手势滑动源码实例

    本教程将深入探讨如何在Android应用中实现手势滑动,并提供一个源码实例——TestFlip。 一、Android手势识别基础 Android系统提供了GestureDetector类来处理基本的手势,如单击、双击、长按等。同时,...

    安卓Android源码——android 自定义对话框.zip

    本资源"安卓Android源码——android 自定义对话框.zip"包含了实现自定义对话框的源代码,这对于理解和实践Android应用的界面定制具有重要意义。 首先,我们要理解Android系统提供的默认对话框类`AlertDialog`和`...

    Android Studio 学习笔记-新手入门-(1)第一个案例

    在Android开发领域,Android Studio是官方推荐的集成开发环境(IDE),它为开发者提供了高效、便捷的工具来创建和管理Android应用。这篇学习笔记将引导新手入门,通过创建第一个简单的案例来了解Android Studio的...

    安卓Android源码——项目实例 商业项目源代码.zip

    【标题】"安卓Android源码——项目实例 商业项目源代码.zip" 提供的是一个具体的Android应用程序的源代码,这通常意味着它是一个实际运行的商业级应用,用于教学或者参考。这样的项目实例对于开发者来说非常有价值,...

    涂抹Oracle——三思笔记之一步一步学Oracle

    涂抹Oracle:三思笔记之一步一步学Oracle》作为一本创作之初就定位于技术应用的实践参考书,虽然前前后后串联了Oracle数据库中十余个常用特性或工具,但在章节的设计上完全遵循这一理念。在涉及特性或工具应用的每一...

    Flex.3事件机制(3)——事件的应用实例视频

    Flex.3事件机制(3)——事件的应用实例视频Flex.3事件机制(3)——事件的应用实例视频

    Android创意实例详解书籍源码

    其次,Android创意实例主要体现在UI设计和用户体验上。源码中可能包含各种自定义View的实现,比如动画效果、手势识别、滑动菜单等,这些都是提升应用界面吸引力和互动性的关键。通过分析这些实例,开发者可以学习到...

    安卓Android源码——项目实例商业项目源代码.zip

    本资源"安卓Android源码——项目实例商业项目源代码.zip"提供了一个实际的商业项目源代码,对于学习Android开发者来说,这是一个宝贵的实践机会,能够深入理解Android系统的运行机制以及应用程序的构建过程。...

    android应用开发app设计小游戏————华容道

    本项目"android应用开发app设计小游戏——华容道"就是这样一个实例,它旨在让开发者对手机移动开发有初步的理解,并通过实现中国古老的游戏——华容道,锻炼其编程能力。 华容道游戏是一款策略性的棋盘游戏,源自...

    Android应用开发完全自学手册——核心技术、传感器、2D/3D、多媒体与典型案例

    本书共分21章,内容讲解上深入浅出,实例紧贴开发需求。在技术理论的讲解方面,《Android应用开发完全自学手册:核心技术、传感器、2D/3D、多媒体与典型案例》注重对实际动手能力和完全自学的指导,书中重点讲解了...

Global site tag (gtag.js) - Google Analytics