• 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;  
        }  
  • 相关阅读:
    摆动排序 II
    二进制中1的个数
    n的幂
    丢掉的数字
    phpcms直接取子栏目的内容、调用点击量的方法
    phpcms导航栏当前栏目选中方法
    PHP中的全局变量global和$GLOBALS的区别
    phpcms添加子栏目后的读取
    phpcms取内容发布管理中的来源
    cms替换主页
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5882395.html
Copyright © 2020-2023  润新知