zoukankan      html  css  js  c++  java
  • Android自定义长按事件

    Android系统自带了长按事件,setOnLongClickListener即可监听。但是有时候,你不希望用系统的长按事件,比如当希望长按的时间更长一点的时候。这时候就需要自己来定义这个长按事件了。 

    package chroya.fun;  
       
    import android.content.Context;  
    import android.view.MotionEvent;  
    import android.view.View;  
    import android.view.ViewConfiguration;  
       
    public class LongPressView1 extends View{  
        private int mLastMotionX, mLastMotionY;  
        //是否移动了  
        private boolean isMoved;  
        //是否释放了  
        private boolean isReleased;  
        //计数器,防止多次点击导致最后一次形成longpress的时间变短  
        private int mCounter;  
        //长按的runnable  
        private Runnable mLongPressRunnable;  
        //移动的阈值  
        private static final int TOUCH_SLOP = 20;  
       
        public LongPressView1(Context context) {  
            super(context);  
            mLongPressRunnable = new Runnable() {  
                    
                @Override 
                public void run() {  
                    mCounter--;  
                    //计数器大于0,说明当前执行的Runnable不是最后一次down产生的。  
                    if(mCounter>0 || isReleased || isMoved) return;  
                    performLongClick();  
                }  
            };  
        }  
       
        public boolean dispatchTouchEvent(MotionEvent event) {  
            int x = (int) event.getX();  
            int y = (int) event.getY();  
                
            switch(event.getAction()) {  
            case MotionEvent.ACTION_DOWN:  
                mLastMotionX = x;  
                mLastMotionY = y;  
                mCounter++;  
                isReleased = false;  
                isMoved = false;  
                postDelayed(mLongPressRunnable, ViewConfiguration.getLongPressTimeout());  
                break;  
            case MotionEvent.ACTION_MOVE:  
                if(isMoved) break;  
                if(Math.abs(mLastMotionX-x) > TOUCH_SLOP   
                        || Math.abs(mLastMotionY-y) > TOUCH_SLOP) {  
                    //移动超过阈值,则表示移动了  
                    isMoved = true;  
                }  
                break;  
            case MotionEvent.ACTION_UP:  
                //释放了  
                isReleased = true;  
                break;  
            }  
            return true;  
        }  
  • 相关阅读:
    python测试开发django-115.Paginator分页器展示table表格数据
    python面试题-如"上海 深圳 深圳 上海",要求输入一个匹配模式,比如: aabb,判断是否符合
    python测试开发django-114.ModelForm中局部钩子(clean_)和全局钩子校验
    python测试开发django-113.使用Bootstrap框架
    MySQL将查询的结果作为update更新的数据,且在原字段数据后 CONCAT拼接(lej)
    MongoDB和Redis的区别是什么
    【精选】由浅入深带你吃透MQ原理与应用场景
    mysql 往表中某个字段的字符串后追加字符串
    mongodb 安装及使用
    Redis和MongoDB的区别(面试受用)
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5882395.html
Copyright © 2011-2022 走看看