Android手势操作耍起来!

简介: 目录前言初步了解手势操作六个重写方法小栗子体验一下别忘了双击事件最后前言手势操作是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()真的很好用啊, 但是如果你有多个对象要使用的话, 还是老实复写吧.


最后

还有很多新的手势操作, 绝对不止我文章中写的这些. 但是这些已经足够入门和大多数手势了. 喜欢记得点赞或者关注我哦.


目录
相关文章
|
Java Android开发 iOS开发
|
Android开发 容器
Android官方开发文档Training系列课程中文版:手势处理之ViewGroup的事件管理
原文地址:https://developer.android.com/training/gestures/viewgroup.html 在ViewGroup中处理触摸事件要格外小心,因为在ViewGroup中有很多子View,而这些子View对于不同的触摸事件来说是不同的目标。
996 0
|
前端开发 Android开发
Android官方开发文档Training系列课程中文版:手势处理之拖拽或缩放
原文地址:https://developer.android.com/training/gestures/scale.html 这节课主要学习如何使用触摸手势来拖动、放大屏幕上的对象。
1054 0
|
Android开发 索引 存储
Android官方开发文档Training系列课程中文版:手势处理之多点触控处理
原文地址:http://android.xsoftlab.net/training/gestures/multi.html 多点触控是指多个手指同时触摸屏幕的情况。这节课主要学习如何检测多点触控手势。
914 0
|
Android开发 容器
Android官方开发文档Training系列课程中文版:手势处理之滚动动画及Scroller
原文地址:http://android.xsoftlab.net/training/gestures/scroll.html 在Android中,滑动经常由ScrollView类来实现。
835 0