【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!...

Himi 原创, 欢迎转载,转载请在明显处注明! 谢谢。

原文地址:http://blog.youkuaiyun.com/xiaominghimi/archive/2011/01/12/6130196.aspx

本文补充:网上很多关于手势文章都说Android 对手势的支持是从SDK 1.6 (也就是 API 4)才开始的,但是我用SDK1.5模拟器也能识别!。(本想测试下更低的SDK的支持效果,但是我没有SDK低于1.5版本的....我手机SDK 2.2的 - -、),所以查了Api 发现:

android.view.GestureDetector.OnGestureListener; since api-1 ,

android.view.GestureDetector; since api-1 ,

从API来看从api-1开始就已经支持手势和手势监听器了,那么很多说api-4才支持这句话也没错!因为:android.gesture 这个类是从 api-4才开始支持的,这个类输入法手势识别中会用到!so~

结论:触摸屏手势识别是从API-1 就开始支持了。 而输入法手势识别是API-4才开始支持的!这里要搞清楚!

对于Android 的手势不光在软件中会经常用到,比如浏览器中的翻页,滚动页面等等;当然其实在我们开发Android游戏的时候加上了Android手势操作更会让游戏增加一个亮点,比如一般的CAG ,PUZ等类型的游戏选择关卡啦、简单背景的移动啦,都可以使用手势来操作即可,类似前段时间很火的《让人愤怒的小鸟!》咳咳、不好意思说错了,是《愤怒的小鸟》,因为总是听群里啊,朋友啊说小鸟出新版本啦,小鸟出PC硬盘版啦! 唉~你说可让人愤怒,其实说实话,小鸟这个游戏确实不错,我所看到的唯一的亮点是这款游戏的创意!说实话,现在的游戏没有做不出来的只有想不出来的好创意、咳咳。回到话题来,那么下面我们来稍微了解下什么是Android 手势!

所谓手势操作,类似跳舞机、EZdancer~这些利用不同动作和音符让人手舞足蹈一样,那么Android这里的手势只是让我们在游戏和软件中的操作有了更多的花样和玩法,根据玩家接触屏幕时间的长短,在屏幕上滑动的距离,按下抬起的时间等进行了包装,其实就是Android 对触屏处理做了包装和处理。

那么在Android中其实有两种手势识别技术。一种是触摸屏手势识别,另一种是输入法手势识别;两者比较起来第二种比较灵活,可以自定义手势,比较high!那么这一节我们先来介绍第一种手势识别:触摸屏手势识别;在下篇博文中我会给童鞋们讲解输入法手势识别!

先把两张截图放上来吧:

OK,老方式,先上代码:

MySurfaceView.java

package com.himi; import java.util.Vector; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.GestureDetector.OnGestureListener; import android.view.SurfaceHolder.Callback; import android.view.View.OnTouchListener; /** *@author Himi *@ Gesture (上文)触摸屏手势识别 */ public class MySurfaceViewAnimation extends SurfaceView implements Callback, Runnable, OnGestureListener, OnTouchListener { private Thread th = new Thread(this); private SurfaceHolder sfh; private Canvas canvas; private Paint paint; private Bitmap bmp; private GestureDetector gd; private int bmp_x, bmp_y; private boolean isChagePage; private Vector<String> v_str;// 备注1 public MySurfaceViewAnimation(Context context) { super(context); v_str = new Vector<String>(); this.setKeepScreenOn(true); bmp = BitmapFactory.decodeResource(getResources(), R.drawable.himi_dream); sfh = this.getHolder(); sfh.addCallback(this); paint = new Paint(); paint.setAntiAlias(true); this.setLongClickable(true); // setLongClickable( true )是必须的,因为 只有这样, // 我们当前的SurfaceView(view)才能够处理不同于触屏形式; // 例如:ACTION_MOVE,或者多个ACTION_DOWN this.setOnTouchListener(this);// 将本类绑定触屏监听器 gd = new GestureDetector(this); gd.setIsLongpressEnabled(true); } public void surfaceCreated(SurfaceHolder holder) { // 当系统调用了此方法才创建了view所以在这里才能取到view的宽高!!有些童鞋总是把东西都放在初始化函数里! // 线程最好放在这里来启动,因为放在初始化里的画,那view还没有呢,到了提交画布unlockCanvasAndPost的时候就异常啦! bmp_x = (getWidth() - bmp.getWidth()) >> 2; bmp_y = (getHeight() - bmp.getHeight()) >> 2; th.start(); } public void draw() { try { canvas = sfh.lockCanvas(); if (canvas != null) { canvas.drawColor(Color.WHITE);// 画布刷屏 canvas.drawBitmap(bmp, bmp_x, bmp_y, paint); paint.setTextSize(20);// 设置文字大小 paint.setColor(Color.WHITE); //这里画出一个矩形方便童鞋们看到手势操作调用的函数都是哪些 canvas.drawRect(50, 30, 175,120, paint); paint.setColor(Color.RED);// 设置文字颜色 if (v_str != null) { for (int i = 0; i < v_str.size(); i++) { canvas.drawText(v_str.elementAt(i), 50, 50 + i * 30, paint); } } } } catch (Exception e) { Log.v("Himi", "draw is Error!"); } finally { sfh.unlockCanvasAndPost(canvas); } } @Override public void run() { // TODO Auto-generated method stub while (true) { draw(); try { Thread.sleep(100); } catch (Exception ex) { } } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void surfaceDestroyed(SurfaceHolder holder) { } // @Override // public boolean onTouchEvent(MotionEvent event) {// 备注2 // return true; // } @Override public boolean onTouch(View v, MotionEvent event) {// 备注3 if (v_str != null) v_str.removeAllElements(); return gd.onTouchEvent(event);// 备注4 } // --------------以下是使用OnGestureListener手势监听的时候重写的函数--------- /** * @以下方法中的参数解释: * @e1:第1个是 ACTION_DOWN MotionEvent 按下的动作 * @e2:后一个是ACTION_UP MotionEvent 抬起的动作(这里要看下备注5的解释) * @velocityX:X轴上的移动速度,像素/秒 * @velocityY:Y轴上的移动速度,像素/秒 */ @Override public boolean onDown(MotionEvent e) { // ACTION_DOWN v_str.add("onDown"); return false; } @Override // ACTION_DOWN 、短按不移动 public void onShowPress(MotionEvent e) { v_str.add("onShowPress"); } @Override // ACTION_DOWN 、长按不滑动 public void onLongPress(MotionEvent e) { v_str.add("onLongPress"); } @Override // ACTION_DOWN 、慢滑动 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { v_str.add("onScroll"); return false; } @Override // ACTION_DOWN 、快滑动、 ACTION_UP public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { v_str.add("onFling"); //-------备注5---------- // if(e1.getAction()==MotionEvent.ACTION_MOVE){ // v_str.add("onFling"); // }else if(e1.getAction()==MotionEvent.ACTION_DOWN){ // v_str.add("onFling"); // }else if(e1.getAction()==MotionEvent.ACTION_UP){ // v_str.add("onFling"); // } // if(e2.getAction()==MotionEvent.ACTION_MOVE){ // v_str.add("onFling"); // }else if(e2.getAction()==MotionEvent.ACTION_DOWN){ // v_str.add("onFling"); // }else if(e2.getAction()==MotionEvent.ACTION_UP){ // v_str.add("onFling"); // } if (isChagePage) bmp = BitmapFactory.decodeResource(getResources(), R.drawable.himi_dream); else bmp = BitmapFactory.decodeResource(getResources(), R.drawable.himi_warm); isChagePage = !isChagePage; return false; } @Override // 短按ACTION_DOWN、ACTION_UP public boolean onSingleTapUp(MotionEvent e) { v_str.add("onSingleTapUp"); return false; } }


补充一下:代码初始化手势的时候有这么一句:gd.setIsLongpressEnabled(true);这个函数标识,如果你设置true的话就是开启了长按键,当你长时间触屏不动就能得到onLongPress 手势,如果设置false 那么你长时间触屏不移动也得不到这个手势的支持~此函数不设置也默认设置为true

备注1:

这里我只是给一些不太熟悉这种定义Vector方式的童鞋简单介绍一下:我们一般定义容器的时候都是直接 Vector vc =new Vector();嗯,没错,但是这种Vector<String>的定义是种泛型定义,那么简单的说下区别,如果Vector vc =new Vector();这种方式装入Object的以后,取的时候是不是要把取出的进行强转一下类型?! 呵呵,而Vector<String>这种定义的时候就表明了这个容器我只装String类型的元素,so~取出的时候也不用再去强转了。

备注2 :通过测试发现,这里仍然响应触屏时间,即使你把触屏焦点设置成setFocusableInTouchMode(false)也会调用!!!原因是因为我们本类的view绑定了触屏事件监听器,那么肯定会先响应备注3,然后我们备注4这里没有 return true而是直接返给了手势监听器去监听,让监听器找合适的函数来处理用户的手势,也就是说没有标志处理完成,所以我们的重写的onTouchEvent()也会继续去处理!

备注5:

这里注释的代码我是在测试两个动作到底是哪两个,因为网上介绍Android手势帖子都疯传说:

第一个是MotionEvent.ACTION_DOWN 第二个是MotionEvent.ACTION_MOVE!那么第一个动作是按下好理解是玩家刚触屏的动作,第二个是move!难道是移动的点都记录下来了??

其实测试结果发现:

第一个是MotionEvent.ACTION_DOWN 第二个是MotionEvent.ACTION_UP!

唉~现在网上的帖子真是各种抄袭~就不能测试下??郁闷!既然这两个动作一个是按下一个是抬起那就很明确其意义了,我们可以根据

这两个动作知道用户到底滑动的距离等等了,其距离e2.getX()-e1.getX();

总结:

1.触屏后、一直触屏不动、演变顺序:onDown->onShowPress->onLongPress;

2.触屏后、一直触屏慢移动是onScroll/快移动是onFling 、手指离开屏幕;

注意 :触屏后、一直触屏移动,如果手指不离开屏幕一直都是onScroll,不管你移动的速度多快,永远不会是onFling!

Ok,手势虽然挺简单的,但是如果熟练来使用并且加入游戏中肯定让你的Game增色不少~

我这里给出源码:这个实例我只做了一个手势的处理,因为其他的动作都很简单不多说了~OK 各位晚安~

源码下载地址:http://download.youkuaiyun.com/source/2977447




how2heap 深入学习(1) how2heap glibc 2.23学习 阅读详情

相关推荐

量化数据采集实战:从App接口逆向到Python爬虫系统构建

数据采集是量化分析和自动化策略的基石,其核心原理是通过程序模拟客户端行为,从目标服务器获取结构化数据。在金融科技领域,高效、稳定的数据采集能力直接决定了策略研究的深度和时效性。面对金融App常见的反爬机制,如请求签名和身份认证,工程师需要掌握网络协议分析、接口逆向与模拟请求等关键技术。这些技术不仅能用于获取市场情绪、资金流向等高频数据,更是构建个人量化研究基础设施、实现从主观看盘到客观数据分析转型的关键一步。本文以实战为例,深入剖析了如何系统性地逆向分析数据接口、破解签名算法,并最终构建一个包含代理IP池与

weixin_29032489的博客 1477

【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!

李华明Himi 原创,转载务必在明显处注明:转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/337.html很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这

李华明Himi 2万+

MATLAB/Simulink与ThingSpeak集成:打通物联网数据与工业算法仿真的闭环

在工业算法开发与控制系统设计中,模型仿真与真实世界数据的脱节是常见的工程挑战。其核心原理在于构建一个双向数据流闭环,将虚拟的仿真模型与物理世界的传感器网络连接起来。这一技术方案的核心价值在于大幅缩短算法迭代周期,实现数据驱动的设计与验证。典型的应用场景包括数字孪生构建、预测性维护和硬件在环(HIL)测试的云端化。通过将MATLAB/Simulink这一强大的模型化设计环境,与ThingSpeak物联网云平台进行深度集成,工程师能够轻松地将实时或历史的物联网数据流直接注入仿真模型作为输入,同时将仿真结果实时回

weixin_34220179的博客 469

使用双链表实现GEC6818开发板图片切换

【代码】使用双链表实现GEC6818开发板图片切换。

qq_51043789的博客 490

二叉树的操作之统计二叉树中节点的个数

一,问题描述 给定一颗二叉树,已知其根结点。 ①计算二叉树所有结点的个数 ②计算二叉树中叶子结点的个数 ③计算二叉树中满节点(度为2)的个数   二,算法分析 找出各个问题的基准条件,然后采用递归的方式实现。 ①计算二叉树所有结点的个数 1)当树为空时,结点个数为0,否则为根节点个数 加上 根的左子树中节点个数 再加上 根的右子树中节点的个数 借助遍历二叉树的思路,每访问一个结...

weixin_34200628的博客 4567

VMware 虚拟机里连不上网的五种解决方案

在VMware虚拟机里的虚拟机系统连接不上网络 首先,注意查看适配器选项里的网络连接这两个网络连接是否存在,如果不存在可以重新装一下VM 如果存在,连不上网 解决办法一: 虚拟机设置里,找到“网络适配器”,右边的网络连接选择“NAT 模式”,如果不行的话再linux系统。还是不行的话接着看第二种解决方案。 解决方法二: 可能原因是VMware NET Service...

墨轩 18万+

李华明Himi 游戏开发

http://blog.csdn.net/xiaominghimi/article/category/762640

thinkinwm的专栏 1165

UE5音效系统全解析:从Sound Cue到MetaSounds的实战指南

在游戏开发中,音频系统是构建沉浸式体验的关键技术之一。其核心原理在于通过数字信号处理(DSP)和空间音频渲染,模拟真实世界的听觉感知。传统音频管线通常基于静态资源播放与混合,而现代引擎则引入了程序化音频生成与动态调制技术,这极大地提升了音频的互动性与表现力,使其能够实时响应游戏状态变化。这一技术革新对于开发开放世界、VR及3A级游戏尤为重要,它能实现风吹草动皆有不同声响、音效随环境动态变化的细腻效果。本文聚焦虚幻引擎5(UE5)的音效系统,深入剖析其新旧两套核心架构:稳定高效的Sound Cue、Sound

weixin_31179927的博客 329

90后IT程序员的奋斗之路

李华明,今年23岁,来自安徽省。移动开发专家,多年 J2me、Android、IOS 平台游戏与软件开发经验,现任一家手游公司主程一职,是《Android游戏编程之从零开始》与《IOS游戏编程之从零开始—Cocos2d-x与cocos2d引擎游戏开发》的作者。个人博客地址:http://www.himigame.com/       APKBUS配图     以下回答中,对李...

iteye_18659的博客 405

FPGA控制DDR读写(AXI4总线接口)

FPGA控制DDR读写

qq_42712308的博客 1万+

EMB电子机械制动系统冗余备份方案介绍

随着汽车智能化技术的快速发展,自动驾驶技术的不断升级,对车辆制动系统的可靠性和安全性提出了更高要求。根据国际汽车安全法规(如UN R13-H)的最新修订,L3级及以上自动驾驶车辆必须配备具有冗余功能的制动系统,以确保在任何单一故障发生时仍能维持部分或全部制动能力。本文重点讨论最具前瞻性的EMB(电子机械制动)系统的冗余备份设计方案

m0_59012156的博客 853

【Liux下6818开发板(ARM)】实现简易相册

这个程序实现了一个实现简易的相册,使用6818开发板的液晶屏和触摸屏,可以显示多张BMP格式的图片,并支持通过触摸屏的操作切换图片。

qq_64928278的博客 2909

Qt/C++编写自定义控件42-开关按钮

一、前言 从2010年进入互联网+智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ、360卫士、金山毒霸等,都有很多开关控制一些操作,在Qt widgets应用项目上,在项目中应用些类似的开关按钮,估计也会为项目增添不少新鲜感。 总结了大部分的开关按钮控件,基本上有两大类,第一类是纯代码绘制,这种对代码的掌控度要求比较高,但是灵活性比较好...

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 3327

16—【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能

本文补充:网上很多关于手势文章都说Android 对手势的支持是从SDK 1.6 (也就是 API 4)才开始的,但是我用SDK1.5模拟器也能识别!。(本想测试下更低的SDK的支持效果,但是我没有SDK低于1.5版本的....我手机SDK 2.2的 - -、

Listening_music的专栏 949

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

(转)【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!

李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/337.html 很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方

gxj1680的专栏 757

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【ANDROID游戏开发十六】ANDROID GESTURE之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!...

本站文章均为李华明Himi原创,转载务必在明显处注明:转载自【黑米GameDev街区】 原文链接:http://www.himigame.com/android-game/337.html ——————————————————————— 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读...

weixin_34068198的博客 177

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 【Android游戏开发十五】关于Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化笔记!...
下一篇: 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!...
iteye_6921
博客等级 码龄8年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值