Android上的手势监听实现,Studio项目创建和模拟器

作者:澳门金莎娱乐网站

实验楼最近上线了一些Android的基础课程和项目课。建议你从本课程开始,熟悉Android的开发环境、一些基本的操作技巧以及调试技术,从而更好地学习后续课程。

本实验将带你认识Android系统中的一种交互方式——手势。你将学到如何在Android中调用系统API对手势进行检测并设置相应的监听器,以及如何实现具体的接口来完善手势操作。

《C++ Primer》作为久负盛名的C++经典教程,丰富的教学辅助内容、精心组织的编程示范,无论是初学者入门,或是中、高级程序员提升,都是不容置疑的首选。

本实验分为两个小节,

本课程基于Google官方的API Demos制作。

一本好书只有读过才有价值,然而《C++ Primer》这本厚如砖头的好书,很多人在购买之后,都仅仅只是简单翻阅了前面几个章节,而并未能够认真的完整读完该书。

本章知识点

本章知识点

实验楼为了能够让大家能够更好的利用《C++ Primer》学习C++,推出了深入学习《C++ Primer 第五版》训练营,以任务驱动模式学习经典教材,提供专属在线环境,由一名导师全程指导有问必答,带领你7周完成《C++ Primer》第五版的学习,扎实你的C++基础。并结合个人经验和网络资源为大家整理了一些建议,分享给大家作为参考,希望大家能够正确的通过《C++ Primer》学习C++。

  • 在Android Studio中创建项目
  • 创建并启动Android模拟器
  • Android上的手势检测与接口实现
《C++ Primer》该如何学习?

1.《C++ Primer》这本书一定要从头开始看,仔细阅读千万别跳,C++11穿插在书中的每一个角落,如果直接跳到后面你可能看到新标准又返回来看。而且这种经典的书籍反复看多遍每次也会有新收获。2.一行一行的把书上的代码手敲一遍,边敲,边看效果,然后思考为什么这样做,这样做的效果是什么,遇到不懂的,再仔细的在书中寻找答案,书中都有很详细的解释。刚开始敲代码会遇到比较多语法错误,积累多了就能够很快改正过来。3.做好学习笔记,书中的内容较多,而且大部分的内容不保证所有都常用,所以有一些忘记的会比较快,所以做好学习笔记快速记忆起来自己看,也可以作为以后查漏补缺的工具。

通常,在实验楼Android相关的课程中,你会在最前面的位置看到下面这样的一段话:

请在Android Studio中新建一个名为GesturePractice的项目,包名可以取为com.shiyanlou.android.gesturepractice。项目基于Android 5.1版本,在创建项目时请依靠Blank Acticity模板同时生成一个名为MainActivity的类文件(上述步骤选择默认值就可以达到目的)。

超实用的《C++ Primer》读书指南。

摘至知乎网友沧浪清水的在知乎上的回答。

以《C++ Primer》第五版为例:

  • Part1也就是前八章,除了6.6,6.7节,都要通读。尤其是第三章初步介绍了vector和string,简直就是新手福音,搞定这两个容器就能写一些简单的程序。

  • Part2基本就是数据结构和算法,如果有基础读起来很轻松。9,11 两章介绍的容器,以及12.1节的智能指针要通读。多用智能指针和容器,远离segment fault. 第10章里的泛型算法可以慢慢读,读完以后可以写出高逼格的函数式风格C++。12.2节讲了怎么用new和delete分配空间,题主作为新手,知道这 种写法就行,写程序时尽量用容器代替原始数组,尤其是代码里最好不要有delete。

  • Part3是块硬骨头,标题就是Tools for Class Authors. 作为一个"class user",有些部分第一次是可以略过的。13章很重要,要细读。初始化,复制,赋值,右值引用是C++里很微妙很重要的部分,别的语言对于这些概念很少有区分得这么细的。这一章不但要精读,还要完全掌握。14章的操作符重载第一次可以观其大略;14.9节第一次可以跳过。15章讲OOP,重要性不言而喻。如果之前一点概念都没有,学起来会觉得比较抽象。网上关于OOP有很多通俗有趣的文章,可以一起看看。16章讲泛型编程,第一次读16.1节,掌握最基本的函数模板和类模板就行了。

  • Part4 就更高档了,很多内容第一次就算啃下来,长久不用又忘了。第一次读推荐把18.2节读懂,命名空间简单易用效果好。别的内容可以观其大略,用时再看。 17.1节的tuple是个有趣的东东,可以读一读。17.3节的正则表达式和17.4节的随机数也许有用,也可以读一读。如果需要读写文件,要读一下 17.5.2节的raw I/O和17.5.3节的random I/O。

请在Android Studio中新建一个名为XXXPractice的项目,包名可以取为com.shiyanlou.android.xxxpractice。项目基于Android 5.1版本的SDK,在创建项目时请依靠Blank Acticity模板同时生成一个名为MainActivity的类文件。

等待项目创建完成。在下一个实验步骤开始前,建议在Android Studio的AVD Manager中(在Tools->Android菜单中可以找到)创建并启动好一个Android Virtual Device模拟器。在模拟器启动的过程中,我们继续学习这个实验的内容。

我们将在本节实验中为你详细展开上述操作的具体步骤。

如果你不是很清楚在Android Studio中如何创建Android Project项目或者创建并运行一个AVD模拟器,请参考《Android小案例

如同你耳熟能详的DevC++CodeBlocksVisualStudioEclipseAndroid Studio已经逐渐取代Eclipse成为主流的Android开发环境。它能够运行在linux、Windows或Mac OS X。

  • 常用绘图方法》这个实验中的做法。

对于Android Studio与Eclipse之间的比较,你可以阅读知乎上的《Android Studio 比 Eclipse 好用在哪里?》。

为获得更好的模拟器显示效果,请在本实验中,将AVD的屏幕缩放比例(Scale)设置为默认值或者“2dp on device = 1px on screen”。

通常在打开Android课程的实验环境后,你看到的linux虚拟机环境如下所示:

移动设备大行其道的今天,手势是一个流行词汇,那手势是什么呢?手,是人类各种创造性活动的天然工具,人们天生就会使用手的动作去表达情感,比如人们 会使用握手来表示友好,聋哑人使用一套用手语来代替语言交流,这些都是手势在生活中的应用。可见自古以来手势就是一套特定的语言系统,在人的交流中发挥重 要的作用。从交互上看,手势实际上是一种输入模式。我们现在在直观意义上理解的人机交互是指人与机器之间的互动方式,这种互动方式经历了鼠标、物理硬件、 屏幕触控、远距离的体感操作的逐步发展的过程。

图片 1此处输入图片的描述

(引用自腾讯CDC-移动设备手势设计初探)

此时双击桌面左上角的AndroidStudio图标打开它。

对于开发者而言,如同按钮的点击一样,手势的触发也是一种事件。而我们通常将用户的手指或者是能够触发手势的设备在能识别手势的设备上的触碰动作认为是手势事件。这样的设计能够充分体现移动设备的交互优势,能够让用户以更加自然的方式参与到与应用的交互之中。

图片 2此处输入图片的描述

下面列举了一些常见的手势操作:

在启动画面中你可以看到右下角的一行字。是的,Android Studio是基于IntelliJ IDEA的集成开发环境。IntelliJ IDEA是被公认为最好的java开发工具之一,它的一些特性极大地简化了开发流程。你可以通过百度百科

图片 3此处输入图片的描述

  • IntelliJ IDEA来详细了解它。

当然,每种手势具体能用来做什么,是由你的应用决定的,但我们推荐你参考一些较新的移动互联网应用开发规范来使得你的应用不那么与世隔绝。

图片 4此处输入图片的描述

对于一些常见的手势,比如短按长按双击拖拽等,Android已实现了相应的手势检测,并为其提供了相应的API来满足开发需要。这些手势将在本实验被详细的介绍。

此时你可以看到Android Studio的欢迎页已经出来了,就像下面这样:

而另外一些非常规的手势,例如在屏幕上画个圈、画一个特殊的几何形状等,Android没有为它们提供特定的手势检测,但允许开发者自己来添加手势,通过与手势相似度相关的API来负责识别。

图片 5此处输入图片的描述

在Android中,是由GestureDetector类来负责手势的检测,每一个GestureDetector类的实例都代表一个手势监听器。我们在为按钮设置点击事件监听器时会用到OnClickListener,同样,你在创建手势监听器时也需要一个类似的OnGestureListener实例。

左侧的Recent Projects将会显示你在这里编辑做的最近项目。右侧的Quick Start则是快速开始选项。

OnGestureListerner接口里面,有以下事件处理的方法可供你调用:

红色方框选中的Start a new Android Studio project选项通常是我们课程里最常使用的,用于创建一个新的Android项目。

-boolean onDown(MotionEvent e):当用户在屏幕上按下时会触发该方法,但在移动或抬起手指时不会触发。

-void onShowPress(MotionEvent e):当用户在屏幕上按下,并且既没有移动有没有抬起手指时,会触发该方法。一般通过该方法告知用户他们的动作已经被识别到了,你可以高亮某个元素来提醒他们。

-boolean onSingleTapUp(MotionEvent e);:当用户在屏幕上轻击时(通常是指点击屏幕的时间很短)会触发该方法。

-boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);:当用户在屏幕上发起滚动的手势时会触发该方法。参数中的e1指第一个按下开始滚动的动作事件,e2指触发当前这个方法的移动动作的事件,distanceXdistanceY则分别触发onScroll方法期间的X、Y轴上的滚动距离,而不是e1e2两个事件发生直接的距离。

-void onLongPress(MotionEvent e);:当用户在屏幕上持续地长按时会触发该方法。

-boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);:当用户在屏幕上持续地按下并且有“抛”的动作时,会触发该方法。对于该事件的理解,你可以体会一下按住一个图标然后把它扔到某个地方的感觉。参数中的e1指第一个按下的动作事件,e2指触发当前这个方法的“猛扔”动作的事件,velocityXvelocityY则分别触发onFling方法期间X、Y轴上的移动速度。

在此介绍一下其他的选项:

如果你翻阅这些API的源代码,你还能发现还有一个名为OnDoubleTapListener的接口,显然是双击事件的一个监听器,它包含了下面这些方法。

  1. Open an existing Android Studio Project:打开已有的Android Studio项目。在经历一段时间的学习后,如果你想继续编辑之前的项目,或者打开一个从网上下载的例子,你可以点击此选项。
  2. Import an Android code sample:导入Android代码样例。该功能将从Google及其合作伙伴那里读取示例的列表,你可以下载并查看一些优秀的项目并继续编辑它们(此功能需要科学上网)。
  3. Check out project from Version Control:从版本控制库中获取项目。对于团队开发来说,版本控制是必不可少的工具。此选项允许你从GitHubGoogle Cloud以及TortoiseSVN等处同步项目。事实上,Android Studio对于这些版本控制工具的支持也是很好的,你可以在设置中进行设定。
  4. Import project(Eclipse ADT, Gradle, etc.):导入其他开发环境中的项目。通过该选项你可以将在Eclipse等处生成的项目迁移到Android Studio的开发环境中。
  5. Configure:设置。你可以在这里导入导出配置文件、管理插件和SDK,以及更新等等。
  6. Docs and How-Tos:文档及提示。在这里对于Android Studio的使用给出了一些帮助和快捷键的对照表。但由于跳转的多数为境外网站,所以此功能并不是非常实用。

-boolean onSingleTapConfirmed(MotionEvent e):当用户在屏幕上单击是会触发此方法,与上面的onSingleTapUp方法不同的地方在于,该方法只会在监听器确定了用户在第一次单击后不会触发双击事件时才会被触发。

-boolean onDoubleTap(MotionEvent e):当用户在屏幕上双击时会触发此方法。这里的按下动作事件指的时双击中的第一次触击。

-boolean onDoubleTapEvent(MotionEvent e):在双击事件发生时会触发此方法,包括了按下、移动和抬起事件。

Android Studio有更多的功能有待你去挖掘。对于创建项目而言,我们点击红框圈中的这个选项即可,此时会弹出新建项目对话框。

掌握了上面这些方法后,我们通过一个实例来实际应用一下:

图片 6此处输入图片的描述

实验步骤主要有:

在该对话框中你需要填写待创建的项目名称、公司域名和项目的存放位置。

  1. 若你已在第二小节完成,请跳至下一步)使用Android Studio创建应用项目GesturePractice,包名为com.shiyanlou.android.gesturepractice,基于Android 5.1。同时添加MainActivity及其布局资源文件。在项目创建好之后再创建并打开AVD模拟器(镜像选择API22:Android 5.1.1)。
  2. res/layout/activity_main.xml资源文件放入一个文本标签。
  3. MainActivity.java中,为这个Activity添加手势监听相关的代码。
  4. 编译并运行这个应用,等待应用安装至模拟器,在模拟器中试用该应用。

在填写时,有以下事项你需要注意:

下面是res/layout/avtivity_main.xml中的布局:

  1. 应用的命名应采用驼峰命名法,首字母必须要大写。
  2. 此处的Company Domain在商业开发中是常用的,目的是便于归档。对于初学者而言,你可以理解为下面的Package name是域名的反转,即如果你要创建一个名为com.shiyanlou.android.myfirstandroidapp的包,你只需要填写域名为android.shiyanlou.com即可,末尾的myfirstandroidapp会被自动添加。这里的是java中包的概念。
  3. 根据实际情况,你可以设置Project location,也就是项目的位置。通常情况下我们使用默认值就行。
<RelativeLayout xmlns:andro xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android: android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="Shiyanlou.com" android:textSize="40dp" android:textColor="#11AA8C" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android: android:layout_below="@+id/textView_domain" android:layout_centerHorizontal="true" android:text="Gesture Practice" android:textColor="#000000" android:textSize="40dp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android: android:layout_below="@+id/textView_title" android:layout_marginTop="50dp" android:layout_centerHorizontal="true" android:text="Hello World!" android:textColor="#000000" /></RelativeLayout>

填好后,点击右下角的Next按钮进入下一步——选择目标Android设备。

下面是MainActivity.java中的源代码:

图片 7此处输入图片的描述

package com.shiyanlou.android.gesturepractice;import android.app.Activity;import android.os.Bundle;import android.view.GestureDetector;import android.view.MotionEvent;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity implements GestureDetector.OnGestureListener{ //在这个类中需要实现OnGestureListener相关的接口 private TextView textview; //声明一个文本标签 private float fontSize = 30; //声明一个用于指示字体大小的变量,初始值为30 GestureDetector detector; //声明一个手势检测器对象 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textview = findViewById(R.id.textView_helloWorld); textview.setTextSize; //实例化这个文本标签并为其设置最初始的大小 detector = new GestureDetector(this, this); //实例化这个手势检测器对象 } //下面实现的这些接口负责处理所有在该Activity上发生的触碰屏幕相关的事件 @Override public boolean onTouchEvent(MotionEvent e) { return detector.onTouchEvent; } //我们就onScroll方法来进行补充 @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { showShortToast("The method has been called - onScroll"); //当该方法被调用时,通过一个Toast来提示用户哪个方法被调用了,下同 if(distanceY >= 0){ //和distanceX一样,distanceY这个参数有正有负,我们对该数值所处的不同范围分别处理 //向上滚动的手势可以让文本标签的字号变小 if(fontSize > 10) fontSize -= 5; //加一个判断的目的是防止字号太小或者太大,下同 textview.setTextSize; //将计算好的字号应用到文本标签上 } else{ //向下滚动的手势可以让文本标签的字号变小 if(fontSize <60) fontSize += 5; textview.setTextSize; } return false; } @Override public boolean onDown(MotionEvent e) { showShortToast("The method has been called - onDown"); return false; } @Override public void onShowPress(MotionEvent e) { showShortToast("The method has been called - onShowPress"); } @Override public boolean onSingleTapUp(MotionEvent e) { showShortToast("The method has been called - onSingleTapUp"); return false; } @Override public void onLongPress(MotionEvent e) { showShortToast("The method has been called - onLongPress"); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { showShortToast("The method has been called - onFling"); return false; } //我们将Toast封装一下,以便调用时只需要传入待显示的消息,而略去了填写Context和持续时间等参数。 public void showShortToast(String message){ Toast.makeText(this.getApplicationContext(), message, Toast.LENGTH_SHORT).show(); }}

本文由澳门金莎娱乐网站发布,转载请注明来源

关键词: