文档章节

android 中手势GestureDetector

一个游戏8
 一个游戏8
发布于 2016/12/12 11:54
字数 628
阅读 54
收藏 0

android 中手势GestureDetector

GestureDetector 的代码使用

public class TestGestureDetectorView extends LinearLayout {

    public static final String TAG = TestGestureDetectorView.class.getSimpleName() + "----";


    public static final int ACTION_DOWN = 0;

    public static final int ACTION_UP = 1;

    public static final int ACTION_MOVE = 2;

    public TestGestureDetectorView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    GestureDetector gestureDetector;


    public void init() {


        gestureDetector = new GestureDetector(getContext(), onGestureListener);

        setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                gestureDetector.onTouchEvent(motionEvent);
                return true;
                //请注意这里要返回true(注:因为事件消费的原因如果你在自定义控件为LinearLayout默认没有消费事件的(返回的false),那么onScroll事件就不能执行当为Button的时候要执行)
                //(所以返回true代表我们消费了down事件,以后的事件onMove onUp处理都会在这里处理)
            }
        });
    }

    GestureDetector.OnGestureListener onGestureListener = new GestureDetector.OnGestureListener() {
        @Override
        public boolean onDown(MotionEvent motionEvent) {
            Log.e(TAG, TAG + "onDown---" + "motionEvent=" + getAction(motionEvent));
            return true;
        }

        @Override
        public void onShowPress(MotionEvent motionEvent) {
            Log.e(TAG, TAG + "onShowPress---" + "motionEvent=" + getAction(motionEvent));
        }

        @Override
        public boolean onSingleTapUp(MotionEvent motionEvent) {
            Log.e(TAG, TAG + "onSingleTapUp---" + "motionEvent=" + getAction(motionEvent));
            return false;
        }

        @Override
        public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
            Log.e(TAG, TAG + "onScroll---" + "motionEvent=" + getAction(motionEvent) + "---motionEvent1=" + getAction(motionEvent1));
            return false;
        }

        @Override
        public void onLongPress(MotionEvent motionEvent) {
            Log.e(TAG, TAG + "onLongPress---" + "motionEvent=" + getAction(motionEvent));
        }

        @Override
        public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
            Log.e(TAG, TAG + "onFling---" + "motionEvent=" + getAction(motionEvent) + "---motionEvent1=" + getAction(motionEvent1));
            return false;
        }
    };

    public String getAction(MotionEvent motionEvent) {
        String action = "noneAction";
        switch (motionEvent.getAction()) {

            case ACTION_DOWN:
                action = "ACTION_DOWN";
                break;
            case ACTION_MOVE:
                action = "ACTION_MOVE";
                break;
            case ACTION_UP:
                action = "ACTION_UP";
                break;
        }

        return action;

    }
}

好的我们现在来分析一下
这些事件

onDown(MotionEvent motionEvent)------ 当按下屏幕的时候 触发,

触发回调方法 onDown(ACTION_DOWN)

注意:

onDown方法只会接收到ACTION_DOWN的事件

onShowPress(MotionEvent motionEvent)------ 短暂停留点击 触发,

触发回调方法 onDown(ACTION_DOWN)----onShowPress(ACTION_DOWN)

注意: onShowPress方法只会接收到ACTION_DOWN的事件

onSingleTapUp(MotionEvent motionEvent)-----快速点击一下并不滑动 触发,

触发回调方法 有两种可能

  1. onDown(ACTION_DOWN)---onSingleTapUp(ACTION_UP)
  2. onDown(ACTION_DOWN)----onShowPress(ACTION_DOWN) ---onSingleTapUp(ACTION_UP)

注意:

onSingleTapUp方法只会接收到ACTION_UP的事件

onLongPress(MotionEvent motionEvent)-----长时间按下并不滑动 触发

触发回掉方法

onDown(ACTION_DOWN)----onShowPress(ACTION_DOWN)---onLongPress(ACTION_DOWN)

注意:

onLongPress方法只会接收到ACTION_DOWN的事件

onScroll(MotionEvent motionEvent,MotionEvent motionEvent1)----按下并滑动 触发

触发回掉方法有两中可能

  1. onDown(ACTION_DOWN)--onScroll(ACTION_DOWN,ACTION_MOVE)---onScroll(ACTION_DOWN,ACTION_MOVE)---onFling(ACTION_UP)
  2. onDown(ACTION_DOWN)--onScroll(ACTION_DOWN,ACTION_MOVE)---onScroll(ACTION_DOWN,ACTION_MOVE)

注意:

  • onScroll方法第一个参数motionEvent接收的是我们ACTION_DOWN的事件,并且不会变化,它和onDown的事件是一样的
  • onScroll方法第二个参数motionEvent是我们ACTION_MOVE的事件,只接收ACTION_MOVE
  • 请注意网上说onFling一定会被执行是错误的(请大家先向右边滑动再滑动回来就不会触发onFling)

onFling(MotionEvent motionEvent,MotionEvent motionEvent1)

  • 请看onScroll方法

© 著作权归作者所有

一个游戏8
粉丝 8
博文 85
码字总数 25433
作品 0
成都
程序员
私信 提问
Android 手势(Gesture)

一、什么是手势? 所谓手势,其实就是指用户手指或触摸笔在触摸屏上的连续触碰行为,比如在屏幕上葱左至右划出一个动作,就是手势,再比如在屏幕上画一个圆圈也是一个手势,手势这种连续的触...

让代码飞一会
2015/07/13
851
1
Android手势学习之单点手势

最后更新:2012-03-20 参考自:《Android移动开发一本就够》 说在前面,很早时,android就开始有支持单点手势(单点触控),到android2.2开始支持多点触控. 不同的动作序列合起来表示不同的手势...

李海珍
2012/03/13
4.4K
2
【Android】滑动屏幕效果GestureDetector、OnGestureListener、ViewFlipper

屏幕切换指的是在同一个Activity内屏幕见的切换。 通过GestureDetector、OnGestureListener实现滑屏事件。ViewFlipper是继承至FrameLayout的,所以它是一个Layout里面可以放置多个View。示例...

晨曦之光
2012/03/01
2.1K
0
【安卓深度控件开发(1.3)】Creating Custom Views (官方示例文档汉化版)(3)

创建视图交互 图形用户界面只是创建自定义视图的一部分。您还需要使视图以模仿现实世界行动相似的方式响应用户输入。对象始终应像真正对象做的一样。例如,图像应不立即弹出并重现在某个地方...

夜狼
2013/03/23
221
0
编写android简单的手势切换视图示例

原文转自:http://marshal.easymorse.com/archives/2595 android的home screen,可以通过手指的向左拖动和向右拖动,切换屏幕视图。 这样做的好处是用户体验比较好,比向下滚屏或者使用tab切...

华宰
2011/09/07
810
1

没有更多内容

加载失败,请刷新页面

加载更多

为什么Netty的FastThreadLocal速度快

前言 最近在看netty源码的时候发现了一个叫FastThreadLocal的类,jdk本身自带了ThreadLocal类,所以可以大致想到此类比jdk自带的类速度更快,主要快在什么地方,以及为什么速度更快,下面做一...

ksfzhaohui
10分钟前
2
0
资治通鉴解析:无论什么条件,要挟权力做出承诺,都会被清算

电影《满城尽带黄金甲》里有句经典的名言“朕赐给你的,才是你的。朕不给你的,你不能抢。”之所以这段话有名,核心的就是,它揭示了这样一个权力心思:无论什么情况,权力的行使,都不愿意受...

太空堡垒185
14分钟前
1
0
CSS技巧之向下箭头

本文转载于:专业的前端网站➫CSS技巧之向下箭头 思路: 使用◇符号(可在输入法的软键盘找到该符号),使用定位选择位置,并隐藏溢出的上半部分 细点: 1.使用i标签的楷体属性把◇变大 2.给i...

前端老手
31分钟前
1
0
SpringCloud alibaba微服务之NACOS多环境配置整合

前言 伴随着spring cloud alibaba 登上主板以后,我就去了解下感觉还是蛮不错的。说实话第一次看见Nacos好长一段时间连读法都不知道...(/nɑ:kəʊs/)。按照官方的话说Nacos是:一个更易于...

攻城狮-飞牛
33分钟前
2
0
tcpdump

tcpdump -A -s0 port 21011 -i any (1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型 (2)-i eth1 : 只抓经过接口eth1的包 (3)-t : 不显...

mskk
38分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部