gesture builder(手势识别):could not loadmntsdcardgestures.

gesture builder(手势识别):could not loadmntsdcardgestures.,第1张

您好,第一步:建立手势

使用SDK自带例子GestureBuilder建立手势库(位置:android-sdk-windows\samples\android-8\GestureBuilder)。使用GestureBuilder之前,你需要恢复其到开发环境,然后进行编绎并部署到手机上。此时,就可以使用GestureBuilder建立手势库,生成的手势库文件在SCDard上,默认文件名称为:gestures

第二步:在应用中加载手势库文件,然后开发手势识别代码。

把手势库文件gestures文件拷贝到项目的res/raw目录下。然后在布局文件中添加用于手势绘制的View:

<android.gesture.GestureOverlayView

android:id="@+id/gestures"

android:layout_width="fill_parent“ android:layout_height="0dip"

android:layout_weight="1.0"

/>

大多数情况下,手势都是通过一笔完成。然而有一些特别的需求就需要通过多个笔画来实现,这时可以使用gestureStrokeType属性进行设置:Multiple:1

手势识别代码见ppt下方

public class MainActivity extends Activity {

private GestureOverlayView gestureOverlayView

private GestureLibrary mLibrary

private boolean state

private EditText addressText

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState)

setContentView(R.layout.main)

addressText = (EditText)this.findViewById(R.id.address)

gestureOverlayView = (GestureOverlayView)this.findViewById(R.id.gestures)

//当用户完成一次Gesture绘制后,系统将自动调用Listener对象的onGesturePerformed()方法

gestureOverlayView.addOnGesturePerformedListener(new GestureListener())

mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures)

state = mLibrary.load()//加载手势库

}

private final class GestureListener implements GestureOverlayView.OnGesturePerformedListener{

@Override

public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {

if(state){

List<Prediction>predictions = mLibrary.recognize(gesture)//从手势库中查询匹配的内容,匹配的结果可能包括多个相似的结果,匹配度高的结果放在最前面

if(!predictions.isEmpty()){

Prediction prediction = predictions.get(0)

//prediction的score属性代表了与手势的相似程度

//prediction的name代表手势对应的字母

if(prediction.score >1){

addressText.setText(prediction.name)

}

}

}

}

}

}

---------------------------------------

2.相关理解:手势识别其实就是图形识别,当用户画出图形后,由程序识别然后按照识别的结果进行执行。

----------------------------------------------------------------------------------------------------

3.导入一个android项目到eclipse工作workspace中的方法:

a.在已经workspace已经存在的android项目中拷贝.classpath,.project,project.properties(这里应该是default.properties文件)到

需要导入的项目中

b.然后直接导入项目到eclipse中就可以了

---------------------------------------------------------

4.a、这里要实现的功能是,当用户画出一个对勾后,关闭该应用。

b、当用户画一个L后,就给李德伟打电话

------------------------------------------------------

5.首先要建立手势库,手势识别的时候会从手势库中查找,如果找到就执行相应的业务功能

----------------------------------------------------------------

6.WARNING: Application does not specify an API level requirement!

[2009-12-27 16:51:33 - Tank] WARNING: Application does not specify an API level requirement!

[2009-12-27 16:51:33 - Tank] Device API version is 3 (Android 1.5)

网上一查是由于没有指定users sdk的缘故,修改AndroidManifest.xml文件.

加入:

<uses-sdk android:minSdkVersion="3"></uses-sdk>

加在<manifest></manifest>之间.

------------------------------------------------------

7.2013/5/10

----------------

8.[2013-05-10 22:54:48 - GestureBuilder] Re-installation failed due to different application signatures.

[2013-05-10 22:54:48 - GestureBuilder] You must perform a full uninstall of the application. WARNING: This will remove the application data!

[2013-05-10 22:54:48 - GestureBuilder] Please execute 'adb uninstall com.android.gesture.builder' in a shell.

[2013-05-10 22:54:48 - GestureBuilder] Launch canceled!

这时先运行android模拟机,进入命令行,当然你要定位adb.exe的目录,我是放在E:\android\android-sdk-windows\platform-tools 下

E:\android\android-sdk-windows\platform-tools>adb uninstall com.android.gesture.builder.

重新运行就可以了

--------------------------------------------------

9.这里建立手势库的时候,用的是android自带的一个例子:

这个例子可以在这里找到:

G:\李鹏视频\andoid程序学习及开发\3G手机Android应用开发\3G手机Android应用开发开发资料\开发资料\android-sdk_r06-windows\android-sdk-windows\samples\android-8

就是这个项目:GestureBuilder

---------------------------------------

10.如果出现问题按照上面的方法进行解决

运行该例子程序后:点击Add gesture进行手势添加,也就是添加用户自己画的图片

添加的时候,只要在空白区域画出手势,在Name中输入手势名称就,然后点击Done就

可以添加一个手势了

-------------------------------

11.当添加完手势后,可以查看在sdcard根目录下,有gestures这个文件,这个就是手势库文件

也是一个数据库文件,这时候就可以在这个手势库的基础上进行手势的查找识别了。

---------------------------------------------------------------------------------------

11-1:做的时候首先将上一步生成的手势库文件gestures复制到:/gesture/res/raw/gestures这个路径下,当查不到的时候需要关闭应用

11-2:关闭应用的方法:

当应用不再使用时,通常需要关闭应用,可以使用以下两种方法关闭android应用:

第一种方法:首先获取当前进程的id,然后杀死该进程。 (建议使用)

android.os.Process.killProcess(android.os.Process.myPid())

第二种方法:终止当前正在运行的Java虚拟机,导致程序终止

System.exit(0)

第三种方法:强制关闭与该包有关联的一切执行

ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)

manager.restartPackage(getPackageName())

<uses-permission android:name="android.permission.RESTART_PACKAGES" />

----------------------------------------------------------------------------------------

app我们常用的手势有很多的地方,比如右滑关闭界面等。手势控制分为触发动作(Touch Mechanics,用户手指在屏幕上如何动作)和触发行为(Touch Activities,界面上特定动作在特定情境下引发的结果)。这是因为同样的触发动作(如单次触击)在不同情境下可能会带来不同的结果(如轻触,取消,开启/关闭指示),同样单次触发行为(如放大)可能是由多种触发动作(如捏放,双次触击,双次触击拖拽等)实现。

    一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,但是这个方法太过简单,如果需要处理一些复杂的手势,用这个接口就会很麻烦(因为我们要自己根据用户触摸的轨迹去判断是什么手势)。

    Android sdk给我们提供了GestureDetector类,通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。虽然他能识别手势,但是不同的手势要怎么处理,应该是提供给程序员实现的。

一.GestureDetector简介

1.组成

GestureDetector类用来识别触摸屏的各种手势,它包含了两个接口和一个内部类:

接口:

OnGestureListener:用来监听手势事件(6种)。

OnDoubleTapListener:用来监听双击事件。

内部类:

SimpleOnGestureListener:用来监听所有的手势。实际上它实现了上述两个接口,不过方法体是空的,需要我们自己写。我们可以继承这个类,重写里面的方法进行手势处理。

2.构造

GestureDetector gestureDetector = new GestureDetector(GestureDetector.OnGestureListener listener)

GestureDetector gestureDetector = new GestureDetector(Context context,GestureDetector.OnGestureListener listener)

GestureDetector gestureDetector = new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener)

3.方法

(1)onTouchEvent(MotionEvent ev) 分析捕捉到的触摸事件触发相应的回调函数

(2)setIsLongpressEnabled(boolean isLongpressEnabled) 设置“长按”是否可用

(3)setOnDoubleTapListener(GestureDetector.OnDoubleTapListener onDoubleTapListener) 设置双击监听器

4.使用

流程:

首先,系统捕捉屏幕的触摸事件(onTouchListener),这时还未涉及具体手势,只是简单地捕捉到触摸。

接着,在onTouch()方法中调用GestureDetector的onTouchEvent()方法,将捕捉到的MotionEvent交给GestureDetector来处理

最后,还需要实现抽象方法。

可根据需要选择:

重写OnGestureListener并通过构造函数传入gestureDetector

重写OnDoubleTapListener并通过GestureDetector.setOnDoubleTapListener方法传入gestureDetector

重写SimpleOnGestureListener并通过构造函数传入gestureDetector

实现:

注:不要注重我写的类是什么类,要注重实现方法自定义view和activity中都可以,根据需要继承上面三种listener,传入构造函数即可;

public class TestDemo{

Context context

public TestDemo(Context context){

this.context = context

}

private GestureDetectordetector

private void initView(){

detector =new GestureDetector(context, new MySimple())

detector =new GestureDetector(context, new MyGesture())

detector =new GestureDetector(context, new MyDoubleTap())

setOnTouchListener((v, event) ->{

// 事件监听交给手势类来处理

detector.onTouchEvent(event)

return true

})

}

//与上面二选一

@Override

public boolean onTouchEvent(MotionEvent event) {

return detector.onTouchEvent(event)

}

// 手势监听器类SimpleOnGestureListener

    private class MySimple extends GestureDetector.SimpleOnGestureListener {

        @Override

        public boolean onSingleTapUp(MotionEvent e) {//一次单独的轻击抬起 *** 作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发;如果除了Down以外还有其它 *** 作,那就不再是Single *** 作了,所以也就不会触发这个事件

            return super.onSingleTapUp(e)

        }

        @Override

        public void onLongPress(MotionEvent e) {//长按事件;

            super.onLongPress(e)

        }

        @Override

        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//在屏幕上拖动事件,只要手指移动就会执行,无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法在ACTION_MOVE动作发生时就会触发他不会执行MotionEvent.ACTION_UP,通常用来实现放大缩小和移动。

            return false

        }

        @Override

        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {//滑动屏幕,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发是个甩的动作,这个甩的动作是在一个MotionEvent.ACTION_UP(手指抬起)发生时执行,通常用来实现翻页效果

            return super.onFling(e1, e2, velocityX, velocityY)

        }

        @Override

        public void onShowPress(MotionEvent e) {//down事件发生而move或则up还没发生前触发该事件;

            super.onShowPress(e)

        }

        @Override

        public boolean onDown(MotionEvent e) {//down事件用户按下屏幕

            return super.onDown(e)

        }

        @Override

        public boolean onDoubleTap(MotionEvent e) {//双击事件

            return super.onDoubleTap(e)

        }

        @Override

        public boolean onDoubleTapEvent(MotionEvent e) {//双击间隔中还发生其他的动作。通知DoubleTap手势中的事件,包含down、up和move事件(这里指的是在双击之间发生的事件,例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知)

            return super.onDoubleTapEvent(e)

        }

        @Override

        public boolean onSingleTapConfirmed(MotionEvent e) {//单击事件。用来判定该次点击是SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。

            return super.onSingleTapConfirmed(e)

        }

    }

// 手势监听器类GestureListener

    private class MyGesture extends GestureDetector.OnGestureListener{

        @Override

        public boolean onDown(MotionEvent e) {//down事件用户按下屏幕

            return false

        }

        @Override

        public void onShowPress(MotionEvent e) {//down事件发生瞬间而move或则up还没发生前触发该事件;

        }

        @Override

        public boolean onSingleTapUp(MotionEvent e) {//一次单独的轻击抬起 *** 作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发;如果除了Down以外还有其它 *** 作,那就不再是Single *** 作了,所以也就不会触发这个事件;

            return super.onSingleTapUp(e)

        }

        @Override

        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//在屏幕上拖动事件,只要手指移动就会执行,无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法在ACTION_MOVE动作发生时就会触发他不会执行MotionEvent.ACTION_UP,通常用来实现放大缩小和移动。

            return false

        }

        @Override

        public void onLongPress(MotionEvent e) {//长按事件,超过一定时长触发该事件回调;

            super.onLongPress(e)

        }

        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {//滑动屏幕,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发是个甩的动作,这个甩的动作是在一个MotionEvent.ACTION_UP(手指抬起)发生时执行,通常用来实现翻页效果

            return super.onFling(e1, e2, velocityX, velocityY)

        }

    }

// 手势监听器类SimpleOnGestureListener

    private class MyDoubleTap extends GestureDetector.OnDoubleTapListener {

        @Override

        public boolean onDoubleTap(MotionEvent e) {//双击事件

            return super.onDoubleTap(e)

        }

        @Override

        public boolean onDoubleTapEvent(MotionEvent e) {//双击间隔中还发生其他的动作。通知DoubleTap手势中的事件,包含down、up和move事件(这里指的是在双击之间发生的事件,例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知)

            return super.onDoubleTapEvent(e)

        }

        @Override

        public boolean onSingleTapConfirmed(MotionEvent e) {//单击事件。用来判定该次点击是SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。

            return super.onSingleTapConfirmed(e)

        }

    }

}

关于onFling()和onScroll()的区别:

onFling()是甩,这个甩的动作是在一个MotionEvent.ACTION_UP(手指抬起)发生时执行,而onScroll(),只要手指移动就会执行。他不会执行MotionEvent.ACTION_UP。onFling通常用来实现翻页效果,而onScroll通常用来实现放大缩小和移动。

关于onSingleTapConfirmed和onSingleTapUp的一点区别: OnGestureListener有这样的一个方法onSingleTapUp,和onSingleTapConfirmed容易混淆。二者的区别是:onSingleTapUp,只要手抬起就会执行,而对于onSingleTapConfirmed来说,如果双击的话,则onSingleTapConfirmed不会执行

SimpleOnGestureListener是GestureDetector类的一个内部类,该类是static class,也就是说它实际上是一个外部类。可以在外部继承这个类,重写里面的手势处理方法。

1.OnDoubleTapListener是用来检测鼠标双击事件的

2.SimpleOnGestureListener实际上实现了OnGestureListener 和OnDoubleTapListener,所以它可以完成以上提到的所有手势识别(9种)

给手势识别控制智能车加摄像头需要以下步骤:

1. 选择合适的摄像头:根据自己的需求和预算,选择一款适合的摄像头。可以考虑使用USB接口或者WiFi连接的网络摄像头。

2. 连接到智能车上:将选好的摄像头连接到智能车上。如果是USB接口,可以通过OTG线连接;如果是WiFi连接,则需要在智能车中添加一个无线网卡,并与网络摄像头进行配对。

3. 安装驱动程序:安装相应的驱动程序和软件,以便于电脑或者手机等设备可以识别并 *** 作这个新加入的设备。

4. 编写代码实现手势识别控制功能:利用编程语言(如Python、C++等)编写代码,在原有基础上增加手势识别控制功能。具体实现方式包括调用OpenCV库进行图形处理、使用机器学习算法训练模型来实现手势分类等。

5. 测试和优化:完成以上步骤后,进行测试并不断优化代码,确保系统稳定性和用户体验。

总之,在给手势识别控制智能车加入摄像头时需要注意硬件兼容性、软件驱动支持以及编程技术等方面问题,并且要经过多次测试才可达到理想效果。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11548942.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存