Android手势操作耍起来!
目录
- 前言
- 初步了解手势操作
- 六个重写方法
- 小栗子体验一下
- 别忘了双击事件
- 最后
前言
手势操作是Android交互当中至关重要的. 可以说, 如果一个软件没有好的手势操作, 就不能将其定义为移动端的软件. 这里来看下谷歌提供的
GestureDetector
类. 搭配属性动画使用, 效果更好哦.
初步了解手势操作
先来一段可以快速了解手势操作类的代码. 这里用到了
GestureDetector.SimpleOnGestureListener()
, 可以暂时理解为是一个适配器, 快速实现GestureDetector.OnGestureListener
接口中要实现的方法. 这样的话, 你就可以按需实现, 不用全部重写所有方法.
public class MainActivity extends AppCompatActivity { private GestureDetector mGestureDetector; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btHello = (Button) findViewById(R.id.bt_hello); mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onDown(MotionEvent e) { Toast.makeText(MainActivity.this, "onDown", Toast.LENGTH_SHORT).show(); return false; } @Override public void onShowPress(MotionEvent e) { Toast.makeText(MainActivity.this, "onShowPress", Toast.LENGTH_SHORT).show(); } @Override public boolean onSingleTapUp(MotionEvent e) { Toast.makeText(MainActivity.this, "onSingleTapUp", Toast.LENGTH_SHORT).show(); return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Toast.makeText(MainActivity.this, "onScroll", Toast.LENGTH_SHORT).show(); return false; } @Override public void onLongPress(MotionEvent e) { Toast.makeText(MainActivity.this, "onLongPress", Toast.LENGTH_SHORT).show(); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Toast.makeText(MainActivity.this, "onFling", Toast.LENGTH_SHORT).show(); return false; } }); btHello.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return mGestureDetector.onTouchEvent(event); } }); } }
可以看到手势操作其实就是丰富了原来的触摸事件. 在触摸操作实现那里进行拦截. 然后有六个可重写的方法. 来分析一下这几个方法.
六个重写方法
onDown
这个很好理解了, 就是按下的操作.onShowPress
这个的意思是按压. 什么是按压, 就是比按下更用力, 更多一点时间.onLongPress
这个就是长按了. 比方说你一直按着按钮, 那么执行顺序就是onDown
-->onShowPress
-->onLongPress
.onSingleTapUp
这个就是单点抬手. 就是你单击按钮抬手的那下. 但是有一点要注意. 如果你点击时长小于onLongPress
, 它是会触发的, 如果大于onLongPress
, 它就不会触发了.onScroll
拖动相应. 就是拖着某个控件, 这个就会触发.onFling
滑动相应. 就是快速划一下, 它就会触发.
小栗子体验一下
也说了一些, 我们来体验下.
我们拎着按钮绕了一圈, 我们看下后台的打印.
onDown onShowPress onScroll onScroll onScroll onScroll onScroll onScroll
然后我们再来一次, 先点击一下, 再绕一圈. 点击时候发生了:
onDown onShowPress onSingleTapUp
绕圈时候是:
onDown onShowPress onScroll onScroll onScroll onFling
我们先看下点击事件, 点下去就是
onDown
, 稍微多点一会儿就会触发onShowPress
, 然后抬手就是onSingleTapUp
.
然后分析第一次绕圈, 点下去
onDown
, 停留onShowPress
, 拖动onScroll
, 之后就是多次拖动. 很好理解. 那么再看第二次, 多了一个onFling
, 而且是在最后, 就是说, 我们的拖动操作, 最后抬手的时候会触发onFling
, 但是不是100%. 所以处理的时候要区分这两种操作, 以免冲突.
别忘了双击事件
在pc上, 双击事件是非常常见的, 可以到了移动端, 这种操作就用的不那么多了. 不过我们还是来看看. 先上栗子:
@Override public boolean onDoubleTap(MotionEvent e) { Toast.makeText(MainActivity.this, "onDoubleTap", Toast.LENGTH_SHORT).show(); LogUtil.i("onDoubleTap"); return super.onDoubleTap(e); }
双击按钮之后:
onDown onShowPress onSingleTapUp onDoubleTap onDown onShowPress
这里出现了新加入的
onDoubleTap
, 也就是快速点击被识别到了.
为什么可以直接加入呢, 因为GestureDetector.SimpleOnGestureListener()
之中也实现了GestureDetector.OnDoubleTapListener
中的内容. 如果你不使用GestureDetector.SimpleOnGestureListener()
的话, 可以使用如下代码实现GestureDetector.OnDoubleTapListener
接口.
class MyDoubleTap implements GestureDetector.OnDoubleTapListener{ @Override public boolean onSingleTapConfirmed(MotionEvent e) { return false; } @Override public boolean onDoubleTap(MotionEvent e) { return false; } @Override public boolean onDoubleTapEvent(MotionEvent e) { return false; } }
所以说
GestureDetector.SimpleOnGestureListener()
真的很好用啊, 但是如果你有多个对象要使用的话, 还是老实复写吧.
最后
还有很多新的手势操作, 绝对不止我文章中写的这些. 但是这些已经足够入门和大多数手势了. 喜欢记得点赞或者关注我哦.
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
动画必须有(一): 属性动画浅谈
目录 前言 ObjectAnimator的初步使用 用AnimatorSet进行动画混合 将动画写在xml中 动画监听 ViewPropertyAnimator上手 最后 前言 官方文档传送门 属性动画是非常非常好用的, 谷歌自己都说这是一个强大的框架. 那今天就来了解一下它. ObjectAnimator的初步使用 属性动画最大的特点就是可以让任何Object动起来, 我先给个小栗子, 大家感受一下. TextView tvTest = (TextView) findViewById(R.id.tv_test); float curTranslationY = tvTest.getTranslationY(); ObjectAnimator animator = ObjectAnimator.ofFloat(tvTest, "translationY", curTranslationY, curTranslationY + 100f); animator.setDuration(2000); animator.start(); 栗子 属性动画有个很重要的点就是说, 动画过后, 控件本...
- 下一篇
安卓应用安全指南 5.5.1 处理隐私数据 示例代码
5.5.1 处理隐私数据 示例代码 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 在准备应用的隐私政策时,你可以使用“协助创建应用隐私政策的工具” [29]。 这些工具以 HTML 格式和 XML 格式输出两个文件 - 应用隐私策略的摘要版本和详细版本。 这些文件的 HTML 和 XML 内容符合 MIC SPI 的建议,包括搜索标签等特性。 在下面的示例代码中,我们将演示此工具的用法,并使用由这个工具产生的 HTML 文件来展示程序隐私策略。 [29] http://www.kddilabs.jp/tech/public-tech/appgen.html 更具体地说,你可以使用以下流程图来确定使用哪个示例代码。 这里,“广泛同意”一词,指代广泛许可,由用户在应用的首次加载时,通过展示和查看程序隐私策略授予应用,用于应用将用户数据传输到服务器。 相反,短语“特定同意”指代在传输特定用户数据之前,立即获得的预先同意。 5.5.1.1 授予广泛同意和特定同意:包含应...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Red5直播服务器,属于Java语言的直播服务器