Android自定义长按事件

本文介绍了如何在Android中不使用系统默认的长按事件,而是根据需求自定义长按事件,以实现更长时间的长按操作监听。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

[1].[代码] [Java]代码 跳至 [1]

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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 ;   
    }   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值