基于Android中手势交互的实现方法

闲来无事,琢磨琢磨Android中的手势交互,发现网上在手势方面的文章并不是很多,而且很多的参考价值并不大。于是出此博文,与大家共勉。鉴于我写此博文时对手势交互的研究也不是特深,如果有不正确的地方,还请各位博友批评指正。

首先,在Android系统中,每一次手势交互都会依照以下顺序执行。

1. 接触接触屏一刹那,触发一个MotionEvent事件。

2. 该事件被OnTouchListener监听,在其onTouch()方法里获得该MotionEvent对象。

3. 通过GestureDetector(手势识别器)转发次MotionEvent对象至OnGestureListener。

4. OnGestureListener获得该对象,听根据该对象封装的的信息,做出合适的反馈。

这个顺序可以说就是手势交互的原理,下面一同来了解一下MotionEvent、GestureDetector和OnGestureListener。

MotionEvent: 这个类用于封装手势、触摸笔、轨迹球等等的动作事件。其内部封装了两个重要的属性X和Y,这两个属性分别用于记录横轴和纵轴的坐标。

GestureDetector: 识别各种手势。

OnGestureListener: 这是一个手势交互的监听接口,其中提供了多个抽象方法,并根据GestureDetector的手势识别结果调用相对应的方法。

下面我再通过一个切换美女图片(又是美女图片哦。敬请关注哦,亲)的代码示例,演示一下手势交互的实现,让大伙对上面的执行顺序,以及各手势动作的区分有一个更加深刻的了解和记忆。

首先,提供一个只有ImageView的布局文件——main.xml。


代码如下:

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
     <ImageView android:id="@+id/image" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center"/>
 </LinearLayout>

然后,完成我们的Activity,因为要监听触摸屏的触摸事件和手势时间,所以该Activity必须实现OnTouchListener和OnGestureListener两个接口,并重写其中的方法。具体代码如下:


代码如下:

public class MainActivity extends Activity implements OnTouchListener, OnGestureListener  {

//创建一个用于识别收拾的GestureDetector对象
     private GestureDetector detector = new GestureDetector(this);
     //定义一个数组,用于放漂亮的女孩
     int[] girls = new int[]{R.drawable.girl1, R.drawable.girl2, R.drawable.girl3};
     //定义数组下标,以方便观看各个女孩
     private int index;
     private ImageView image;

@Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

image = (ImageView)findViewById(R.id.image);
        //设置一个初始显示的girl吧
        image.setImageResource(girls[index]);
        //监听这个ImageView组件上的触摸屏时间
        image.setOnTouchListener(this);
        //下面两个要记得设哦,不然就没法处理轻触以外的事件了,例如抛掷动作。
        image.setLongClickable(true);
        detector.setIsLongpressEnabled(true);
     }

//用于呼喊下一个女孩的方法
     public void goNext(){
         index++;
         index = Math.abs(index % girls.length);
         image.setImageResource(girls[index]);
     }

//用户呼唤上一个女孩的方法
     public void goPrevious(){
         index--;
         index = Math.abs(index % girls.length);
         image.setImageResource(girls[index]);
     }

//重写OnTouchListener的onTouch方法
     //此方法在触摸屏被触摸,即发生触摸事件(接触和抚摸两个事件,挺形象)的时候被调用。
     @Override
     public boolean onTouch(View v, MotionEvent event) {
         detector.onTouchEvent(event);
         return true;
     }

//在按下动作时被调用
     @Override
     public boolean onDown(MotionEvent e) {
         return false;
     }

//在抛掷动作时被调用
     @Override
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
             float velocityY) {
         //velocityX表示横向的移动,根据手指移动的方向切换女孩
         if(velocityX < 0){
             goNext();
         }else if(velocityX > 0){
             goPrevious();
         }
         return false;
     }

//在长按时被调用
     @Override
     public void onLongPress(MotionEvent e) {
     }

//在滚动时调用
     @Override
     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
             float distanceY) {
         return false;
     }

//在按住时被调用
     @Override
     public void onShowPress(MotionEvent e) {
     }

//在抬起时被调用
     @Override
     public boolean onSingleTapUp(MotionEvent e) {
         return false;
     }
 }

在刚开始学Android的时候,就觉得Google的文档不咋样,在研究手势时,更加的感觉Google的文档写得实在是太差了。很多常量,属性和方法,居然连个描述都没有。没有描述也就罢了,但是OnGestureListener里手势这么多,它也没有一个介绍说明,在没有进行不断才尝试之前,谁能搞懂onLongPress和onShowPress,onScroll和onFling的关系与差别吗?Google真的需要在文档方面做一次大手术了。不过好在经过鄙人不断反复的尝试。从个人的角度为这几个手势动作做出了定义。

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

除了这些定义之外,鄙人也总结了一点算是经验的经验吧,在这里和大家分享一下。

任何手势动作都会先执行一次按下(onDown)动作。
    长按(onLongPress)动作前一定会执行一次按住(onShowPress)动作。
    按住(onShowPress)动作和按下(onDown)动作之后都会执行一次抬起(onSingleTapUp)动作。
    长按(onLongPress)、滚动(onScroll)和抛掷(onFling)动作之后都不会执行抬起(onSingleTapUp)动作。

说到这里,大致结束。剩下的,就是一起看看运行结果吧。

一、没有抛掷:

二、向右抛掷一次

三、向右再抛掷一次

(0)

相关推荐

  • Android基础之Fragment与Activity交互详解

    今天继续讲解Fragment组件的特性,主要是跟Activity的交互和生命周期的关系,我们前面已经说过Fragment是依赖于Activity的,而且生命周期也跟Activity绑定一起.下面我们看看Fragment跟Activity的关系. 1.为Activity创建事件回调方法在一些情况下, 你可能需要一个fragment与activity分享事件. 一个好的方法是在fragment中定义一个回调的interface, 并要求宿主activity实现它.当activity通过interfa

  • Android实现H5与Native交互的两种方式

    前言 大家都知道在Android WebView使用中,经常需要H5页面和Native页面进行交互,比如在网页上点击分享按钮,调用本地分享接口进行分享,分享成功后本地调用网页的JavaScript代码展示一条分享成功的消息.下面来看看一起看看两种实现方式是什么? 一.Url拦截的方式 重写ShouldOverrideUrl进行Url拦截,这种方式通过H5和Native协商好的Url格式来表明H5页面想要Native进行的操作,比如拨打电话,播放视频,查看某个用户的信息等操作,每种操作对应一种ur

  • Android WebView使用方法详解 附js交互调用方法

    目前很多Android app都内置了可以显示web页面的界面,会发现这个界面一般都是由一个叫做WebView的组件渲染出来的,学习该组件可以为你的app开发提升扩展性. 先说下WebView的一些优点: --可以直接显示和渲染web页面,直接显示网页 --webview可以直接用html文件(网络上或本地assets中)作布局 --和JavaScript交互调用 一.基本使用 首先layout中即为一个基本的简单控件: <WebView android:id="@+id/webView1

  • android中webview控件和javascript交互实例

    当我们要实现丰富的图文混排效果的时候,我们一般会使用webview,这是一个功能十分强大的的控件,来看看官方的解释: 复制代码 代码如下: A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content within your Activity. It uses the WebKit

  • 解析Android中webview和js之间的交互

    1.android中利用webview调用网页上的js代码.Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true,,然后通过loadUrl就可以直接进行调用,如下所示:mWebView.getSettings().setJavaScriptEnabled(true);mWebView.loadUrl("javascript:test()"); 2. 网页上调用android中java代码的方法在网页中

  • Android原生嵌入React Native详解

    1.首先集成的项目目录 我使用的是直接按照react-native init Project 的格式来导入的,也就是说,我的Android项目目录是跟node_modules是在一个目录下的. 我们init完项目之后,项目初始化完成了,这时候我们可以用命令react-native run-android直接运行项目,至于怎么调试,之前已经说过. 说一下我们怎么开发和运行分开吧,我们开发一般会选择webstrom,开发后我们会Android和ios的编译分开. 启动npm 下面说一下android

  • Android中Java和JavaScript交互实例

    Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本.本文将介绍如何实现Java代码和Javascript代码的相互调用. 如何实现 实现Java和js交互十分便捷.通常只需要以下几步. 1.WebView开启JavaScript脚本执行 2.WebView设置供JavaScript调用的交互接口. 3.客户端和网页端编写调用对方的代码. 本例代码 为了便于讲解,先贴出全部代码 Java代码 复制代码 代码如下: pack

  • Android APP与媒体存储服务的交互

    简介:本文介绍如何在 Android 中,开发者的 APP 如何使用媒体存储服务(包含MediaScanner.MediaProvider以及媒体信息解析等部分),包括如何把 APP 新增或修改的文件更新到媒体数据库.如何在多媒体应用中隐藏 APP 产生的文件.如何监听媒体数据库的变化等等.Android 原生有一套媒体存储服务,进程名是 android.process.media,主要负责把磁盘中的文件信息保存到数据库当中,供其他 APP 使用以及 MTP 模式使用.因此 APP 可以随时快速

  • 基于Android中手势交互的实现方法

    闲来无事,琢磨琢磨Android中的手势交互,发现网上在手势方面的文章并不是很多,而且很多的参考价值并不大.于是出此博文,与大家共勉.鉴于我写此博文时对手势交互的研究也不是特深,如果有不正确的地方,还请各位博友批评指正. 首先,在Android系统中,每一次手势交互都会依照以下顺序执行. 1. 接触接触屏一刹那,触发一个MotionEvent事件. 2. 该事件被OnTouchListener监听,在其onTouch()方法里获得该MotionEvent对象. 3. 通过GestureDetec

  • 基于Android中获取资源的id和url方法总结

    一.获取android工程里面的各种资源的id; 1.1 string型 比如下面: << string name="OK">> 客户端请求成功 << / string>> //string资源中 名称为OK的 id 获取方式 int strId = getResources().getIdentifier("OK", "string", getPackageName()); 1.2 color型

  • 基于Android的英文词典的实现方法

    英文词典是手机中经常使用的应用.因此,在本文将结合Android来讨论如何实现一个Android版的英文词典.实现英文词典的方法很多.在本文使用了SQLite数据库来保存英文单词信息.系统通过SQLite数据库中保存的单词信息来查找到与指定英文对应的中文信息.当然,实现这样一个英文词典需要解决一系列技术问题.例如,如何将保存英文单词信息的数据库文件随程序(apk文件)一起发布:发布后如何打开数据库:如何在输入前几个字母后,在AutoCompleteTextView组件提示列表中显示以所输入字符串

  • Android中Socket通信的实现方法概述

    本文实例简述了Android中Socket通信的实现方法,具体内容如下: 一.socket通信概述 通俗的来说套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口. 应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要通过同一个TCP

  • Android中执行java命令的方法及java代码执行并解析shell命令

    android中执行java命令的方法大家都晓得吗,下面一段内容给大家带来了具体解析. android的程序基于java开发,当我们接上调试器,执行adb shell,就可以执行linux命令,但是却并不能执行java命令. 那么在android的shell中是否就不能执行java程序了呢. 答案是否定的.我们可以通过app_process来执行java程序. 写一个hello world吧,就是刚开始学java的时候 写得那个hello world,这次要在android上运行. 用记事本新建

  • 基于TabLayout中的Tab间隔设置方法(实例讲解)

    TabLayout和ViewPager搭配使用,是有很多方便性,但是TabLayout这东西还是有很多被人吐槽的地方. 这里只讲怎么设置tab之间的间隔,网上找了一堆方法,什么padding和margin的啥都没用,没办法,想用TabLayout只能自己想办法了.效果如下: 一.实现方法,既然这东西不好设置,那就直接在背景上做点事情,布局代码如下: <android.support.design.widget.TabLayout xmlns:app="http://schemas.andr

  • 基于Java中字符串indexof() 的使用方法

    Java中字符串中子串的查找共有四种方法(indexof()) indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置.如果没有找到子字符串,则返回-1. 如果 startindex 是负数,则 startindex 被当作零.如果它比最大的字符位置索引还大,则它被当作最大的可能索引. Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(St

  • Android 中隐藏虚拟按键的方法实例代码

    下面通过一段代码给大家讲解android 隐藏虚拟按键的方法,废话不多说了,大家多多看看代码和注释吧,具体代码如下所示: /** * 隐藏虚拟按键,并且全屏 */ protected void hideBottomUIMenu() { //隐藏虚拟按键,并且全屏 if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api View v = this.getWindow().getDec

  • Android中使用Post请求的方法

    本文实例讲述了Android中使用Post请求的方法.分享给大家供大家参考.具体如下: 一.需要用到的场景 在jQuery中使用$.post()就可以方便的发起一个post请求,在android程序中有时也要从服务器获取一些数据,就也必须得使用post请求了. 二.需要用到的主要类 在android中使用post请求主要要用到的类是HttpPost.HttpResponse.EntityUtils 三.主要思路 1.创建HttpPost实例,设置需要请求服务器的url. 2.为创建的HttpPo

  • Android 中ImageView的ScaleType使用方法

    Android 中ImageView的ScaleType使用方法 ImageView的ScaleType属性,表示的是ImageView中资源图片的填充方式.scaleType的属性值有好几种,分别是: matrix(默认) center centerCrop centerInside fitCenter fitEnd fitStart fitXY 这里要注意:matrix表示一种填充方式叫默认填充,如果布局和代码中不设置ScaleType属性,ImageView默认是fitCenter! 先上

随机推荐