当前位置:

首页 > 系统应用 > 3.8 Gestures(手势)

3.8 Gestures(手势)

本文目录

    本节引言: 周六不休息,刚剪完了个大平头回来,继续码字~ 这一节来到第三章的收尾部分,聊的是 Gestures(手势)。用过魅族手机的朋友,对这套交互方式大多不会陌生:比如从 home 键两侧向屏幕内滑动,就能直接调出后台任务列表。其实,手势一旦用到应用里,用户体验往往会明显提升。举个最直观的例子,

    本节引言:

    周六不休息,刚剪完了个大平头回来,继续码字~

    这一节来到第三章的收尾部分,聊的是 Gestures(手势)。用过魅族手机的朋友,对这套交互方式大多不会陌生:比如从 home 键两侧向屏幕内滑动,就能直接调出后台任务列表。其实,手势一旦用到应用里,用户体验往往会明显提升。举个最直观的例子,浏览器里常见的 Scroll 手势可以用来滚动页面,Fling 则常被用来切换页面,这类操作既顺手,也更高效。

    当然,有利也有弊,比如不当的手势操作引起APP Carsh,经常这样可是会引起用户不满的! 所以是否要为你的应用增加手势,可要考虑清楚哦!另外手势要和前面学的单指/多指触碰相区分哦!

    手势是:连续触碰的行为,比如左右上下滑动屏幕,又或者画一些不规则的几何图形! Android对上述两种手势行为都提供了支持:

    • Android提供手势检测,并为手势识别提供了相应的监听器!
    • Android运行开发者自行添加手势,并且提供了相应的API识别用户手势!

    如果你的手机用的是 Android 4.x 的原生系统,那么大概率会在手机或平板里看到谷歌提供的一个 Gesture Builder 应用。这个工具挺直观,用户可以像随手涂鸦一样画出一个手写符号,再把它和某个字符串名称对应起来。当然,就算手头没有这样的设备也没关系,直接用模拟器也一样,开一个 4.0 系统试一试,效果一看便知。另外,还可以到mmtsdcardgestures拿到保存手势的文件。前面的铺垫先到这里,接下来进入正题。

    对了,贴下官方API文档先:GestureDetector

    1.Android中手势交互的执行顺序

    • 1.手指触碰屏幕时,触发MotionEvent事件!
    • 2.该事件被OnTouchListener监听,可在它的onTouch()方法中获得该MotionEvent对象!
    • 3.通过GestureDetector转发MotionEvent对象给OnGestureListener
    • 4.我们可以通过OnGestureListener获得该对象,然后获取相关信息,以及做相关处理!

    我们来看下上述的三个类都是干嘛的: MotionEvent: 这个类用于封装手势、触摸笔、轨迹球等等的动作事件。 其内部封装了两个重要的属性X和Y,这两个属性分别用于记录横轴和纵轴的坐标。 GestureDetector: 识别各种手势。 OnGestureListener: 这是一个手势交互的监听接口,其中提供了多个抽象方法, 并根据GestureDetector的手势识别结果调用相对应的方法。

    ——上述资料摘自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1020/448.html

    2.GestureListener详解:

    从1中我们知道了监听手势的关键是:GestureListener 他给我们提供了下述的回调方法:

    • 按下(onDown): 刚刚手指接触到触摸屏的那一刹那,就是触的那一下。
    • 抛掷(onFling): 手指在触摸屏上迅速移动,并松开的动作。
    • 长按(onLongPress): 手指按在持续一段时间,并且没有松开。
    • 滚动(onScroll): 手指在触摸屏上滑动。
    • 按住(onShowPress): 手指按在触摸屏上,它的时间范围在按下起效,在长按之前。
    • 抬起(onSingleTapUp):手指离开触摸屏的那一刹那。

    知道了GestureListener的相关方法后,实现手势检测也很简单,步骤如下:

    • Step 1: 创建GestureDetector对象,创建时需实现GestureListener传入
    • Step 2: 将Activity或者特定组件上的TouchEvent的事件交给GestureDetector处理即可! 我们写个简单的代码来验证这个流程,即重写对应的方法:

    代码如下:

    public class MainActivity extends AppCompatActivity {
    private MyGestureListener mgListener;
        private GestureDetector mDetector;
        private final static String TAG = "MyGesture";
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            //实例化GestureListener与GestureDetector对象
            mgListener = new MyGestureListener();
            mDetector = new GestureDetector(this, mgListener);
    }
    @Override
        public boolean onTouchEvent(MotionEvent event) {
            return mDetector.onTouchEvent(event);
        }
    //自定义一个GestureListener,这个是View类下的,别写错哦!!!
        private class MyGestureListener implements GestureDetector.OnGestureListener {
    @Override
            public boolean onDown(MotionEvent motionEvent) {
                Log.d(TAG, "onDown:按下");
                return false;
            }
    @Override
            public void onShowPress(MotionEvent motionEvent) {
                Log.d(TAG, "onShowPress:手指按下一段时间,不过还没到长按");
            }
    @Override
            public boolean onSingleTapUp(MotionEvent motionEvent) {
                Log.d(TAG, "onSingleTapUp:手指离开屏幕的一瞬间");
                return false;
            }
    @Override
            public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
                Log.d(TAG, "onScroll:在触摸屏上滑动");
                return false;
            }
    @Override
            public void onLongPress(MotionEvent motionEvent) {
                Log.d(TAG, "onLongPress:长按并且没有松开");
            }
    @Override
            public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
                Log.d(TAG, "onFling:迅速滑动,并松开");
                return false;
            }
        }
    }

    对应操作截图:

    • 1.按下后立即松开:
    • 2.长按后松开:
    • 3.轻轻一滑,同时松开:
    • 4.按住后不放持续做滑动操作:

    PS:从上述结果来看,我们发现了一个问题: 我们实现OnGestureListener需要实现所有的手势,可能我针对的仅仅是滑动,但是你还是要去重载, 这显得很逗逼,是吧,官方肯定会给出解决方法滴,官方另外给我们提供了一个SimpleOnGestureListener类 只需把上述的OnGestureListener替换成SimpleOnGestureListener即可!

    3.简单的例子:下滑关闭Activity,上滑启动新的Activity

    这里就用上述的SimpleOnGestureListener来实现吧:

    运行效果图:

    实现代码:

    public class MainActivity extends AppCompatActivity {
    private GestureDetector mDetector;
        private final static int MIN_MOVE = 200;   //最小距离
        private MyGestureListener mgListener;
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            //实例化SimpleOnGestureListener与GestureDetector对象
            mgListener = new MyGestureListener();
            mDetector = new GestureDetector(this, mgListener);
        }
    @Override
        public boolean onTouchEvent(MotionEvent event) {
            return mDetector.onTouchEvent(event);
        }
    //自定义一个GestureListener,这个是View类下的,别写错哦!!!
        private class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
    @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float v, float v1) {
                if(e1.getY() - e2.getY() > MIN_MOVE){
                    startActivity(new Intent(MainActivity.this, MainActivity.class));
                    Toast.makeText(MainActivity.this, "通过手势启动Activity", Toast.LENGTH_SHORT).show();
                }else if(e1.getY() - e2.getY()  < MIN_MOVE){
                    finish();
                    Toast.makeText(MainActivity.this,"通过手势关闭Activity",Toast.LENGTH_SHORT).show();
                }
                return true;
            }
        }
    }

    结果分析: 从上面的对比就可以知道,相比起SimpleOnGestureListener使用SimpleOnGestureListener 显得更加的简单,想重写什么方法就重写什么方法,另外例子比较简单,大家可以自己试试 其他玩法,比如通过手势缩放图片~

    4.手势添加与识别:

    除了上面讲解的手势检测外,Android还运行我们将手势进行添加,然后提供了相关的识别API; Android中使用GestureLibrary来代表手势库,提供了GestureLibraries工具类来创建手势库!

    四个加载手势库的静态方法:

    获得GestureLibraries对象后,就可以使用该对象提供的下述方法来做相应操作了:

    相关方法:

    • public void addGesture (String entryName, Gesture gesture):添加一个名为entryName的手势
    • public Set getGestureEntries ():获得手势库中所有手势的名称
    • public ArrayList getGestures (String entryName):获得entryName名称对应的全部手势
    • public ArrayList recognize (Gesture gesture): 从当前手势库中识别与gesture匹配的全部手势
    • public void removeEntry (String entryName):删除手势库中entryName名称对应的手势
    • public void removeGesture (String entryName, Gesture gesture):删除手势库中entryName和gesture都匹配的手势
    • public abstract boolean sa ve ():想手势库中添加手势或从中删除手势后调用该方法保存手势库

    GestureOverlayView手势编辑组件:

    Android为GestureOverlayView提供了三种监听器接口,如下,一般常用的是:OnGesturePerformedListener;用于手势完成时提供响应!

    5.手势添加示例:

    PS:例子引用的是——李刚《Android疯狂讲义》的代码

    运行效果图:

    好吧,下面贴下实现代码:

    两个布局文件:activity_main.xml和dialog_sa ve.xml

    activity_main.xml

    
    
    
        
    

    dialog_sa ve.xml

    
    
    
            
            
        
    
    

    MainActivity.ja va:

    public class MainActivity extends AppCompatActivity {
    private EditText editText;
        private GestureOverlayView gesture;
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            //获取手势编辑组件后,设置相关参数
            gesture = (GestureOverlayView) findViewById(R.id.gesture);
            gesture.setGestureColor(Color.GREEN);
            gesture.setGestureStrokeWidth(5);
            gesture.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {
                @Override
                public void onGesturePerformed(GestureOverlayView gestureOverlayView, final Gesture gesture) {
                    View sa veDialog = getLayoutInflater().inflate(R.layout.dialog_sa ve,null,false);
                    ImageView img_show = (ImageView) sa veDialog.findViewById(R.id.img_show);
                    final EditText edit_name = (EditText) sa veDialog.findViewById(R.id.edit_name);
                    Bitmap bitmap = gesture.toBitmap(128,128,10,0xffff0000);
                    img_show.setImageBitmap(bitmap);
                    new AlertDialog.Builder(MainActivity.this).setView(sa veDialog)
                            .setPositiveButton("保存",new DialogInterface.OnClickListener()
                            {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    //获取文件对应的手势库
                                    GestureLibrary gestureLib = GestureLibraries.fromFile("/mnt/sdcard/mygestures");
                                    gestureLib.addGesture(edit_name.getText().toString(),gesture);
                                    gestureLib.sa ve();
                                }
                            }).setNegativeButton("取消", null).show();
                }
            });
        }
    }

    最后还需要在AndroidManifest.xml中添加写入SD卡的权限:

    6.手势识别示例

    实现代码:

    public class MainActivity extends AppCompatActivity {
    private GestureOverlayView gesture;
        private GestureLibrary gestureLibrary;
        private Context mContext;
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            mContext = MainActivity.this;
            gestureLibrary = GestureLibraries.fromFile("mmt/sdcard/mygestures");
            if (gestureLibrary.load()) {
                Toast.makeText(mContext, "手势库加载成功", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(mContext, "手势库加载失败", Toast.LENGTH_SHORT).show();
            }
    //获取手势编辑组件后,设置相关参数
            gesture = (GestureOverlayView) findViewById(R.id.gesture);
            gesture.setGestureColor(Color.GREEN);
            gesture.setGestureStrokeWidth(5);
            gesture.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {
                @Override
                public void onGesturePerformed(GestureOverlayView gestureOverlayView, final Gesture gesture) {
                    //识别用户刚绘制的手势
                    ArrayList predictions = gestureLibrary.recognize(gesture);
                    ArrayList result = new ArrayList();
                    //遍历所有找到的Prediction对象
                    for (Prediction pred : predictions) {
                        if (pred.score > 2.0) {
                            result.add("与手势【" + pred.name + "】相似度为" + pred.score);
                        }
                    }
                    if (result.size() > 0) {
                        ArrayAdapter adapter = new ArrayAdapter(mContext,
                                android.R.layout.simple_dropdown_item_1line, result.toArray());
                        new AlertDialog.Builder(mContext).setAdapter(adapter,null).setPositiveButton("确定",null).show();
                    }else{
                        Toast.makeText(mContext,"无法找到匹配的手势!",Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    }
    

    另外别忘了在AndroidManifest.xml文件中加入读SD卡的权限:

    本节小结:

    好的,本节介绍了Android中的Gesture手势,讲解了手势判断,手势添加,手势识别三个内容 ,大部分例子来自于李刚老师的Android疯狂讲义,有兴趣的可以看看该书~谢谢

    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    系统应用
    相关文章 更多
    Windows 10登录密码、PIN与自动登录设置的安全区别及排查【一文讲解】
    Windows 10登录密码、PIN与自动登录设置的安全区别及排查【一文讲解】

    想取消Win10开机密码?先分清账户密码、PIN码和自动登录的区别。本文提供安全操作步骤,教你如何用PIN替代密码,评估自动登录风险,并解决登录异常问题,避免误删凭据导致数据丢失。

    win10系统更新推送频繁怎么减少更新提示
    win10系统更新推送频繁怎么减少更新提示

    Windows 10更新弹窗频繁影响工作?无需禁用服务,只需调整活动时间、安排重启和优化通知设置,即可有效减少干扰并保持系统安全。

    win10怎么查看当前系统自动更新有没有被关闭
    win10怎么查看当前系统自动更新有没有被关闭

    想知道Win10自动更新是否被关闭?不要只看任务栏。本文教你通过“设置-更新和安全”、“高级选项”及“services.msc服务”三处位置,准确判断系统更新状态是暂停、运行还是受组织策略管理。

    win10休眠唤醒和开机登录密码可以分开取消吗?
    win10休眠唤醒和开机登录密码可以分开取消吗?

    想知道Win10能否只取消休眠唤醒密码而保留开机密码?本教程详解如何通过系统设置和netplwiz工具,分别控制开机登录与睡眠唤醒后的验证要求,实现灵活的安全策略。

    win10取消开机密码之后如何恢复密码登录
    win10取消开机密码之后如何恢复密码登录

    Win10取消开机密码后想恢复?本教程详解如何通过netplwiz恢复开机输入框、重新设置空密码账户、配置PIN码及调整睡眠唤醒登录策略,步骤清晰,即改即验。

    win10注册表修改怎么取消开机自动登录密码
    win10注册表修改怎么取消开机自动登录密码

    想恢复Win10开机密码保护?本文详解如何通过注册表修改AutoAdminLogon值取消自动登录,配合netplwiz工具复核,避免凭据泄露风险,适合家用及办公场景参考。

    win10电脑一开机就下载更新怎么关闭
    win10电脑一开机就下载更新怎么关闭

    Win10一开机就占用网速下载更新?本文教你通过设置暂停更新、调整活动时间及标记计费网络来缓解干扰。区分家庭版与专业版操作差异,避免强制停止服务带来的系统风险,让更新在合适的时间进行。

    win10取消开机密码时输入密码验证失败怎么解决
    win10取消开机密码时输入密码验证失败怎么解决

    Win10取消开机密码时提示验证失败?可能是因为输错了Microsoft账户密码或误用了PIN码。本文详解如何确认账户类型、正确输入凭据及检查自动登录设置,帮你解决验证报错问题。

    win10忘记当前密码了怎么处理完整方法
    win10忘记当前密码了怎么处理完整方法

    Windows 10忘记开机密码如何处理?本文根据账户类型(Microsoft账户/本地账户/PIN)提供官方支持的恢复步骤,包括在线重置、安全问题回答及管理员重置方法,避免数据丢失风险。

    win10更新提示不断弹出如何永久关闭通知
    win10更新提示不断弹出如何永久关闭通知

    Windows 10更新提示频繁弹窗怎么办?本文详解如何通过Windows更新高级选项、系统通知设置及暂停更新功能,精准关闭不必要的重启提醒和横幅通知,同时确保系统安全更新不受影响。适用于家庭及个人用户,区分个人设置与企业策略管理。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    网站备案号:苏ICP备2026018738号-1 联系邮箱:bd@zhengruan.com 网站地图

    Copyright ©2018-2026