您的位置:

Android长按事件详解

一、长按事件的介绍

在Android的应用开发中,长按事件是常用的一个事件类型。长按事件的触发是指在按下一个View并保持不动的同时,在一定的时间内没有抬起手指,就会产生长按事件的触发。在应用中常见的应用场景包括菜单栏、图标等的长按操作。

二、长按事件的触发方式

长按事件的触发有两种情况,一种是View的长按,另一种是手势的长按。在View的长按触发中,需要实现View类的setOnLongClickListener方法,手势的长按触发需要实现GestureDetector类中的onLongPress()方法。对于View的长按触发,下面给出一个示例代码:


imageView.setOnLongClickListener(new OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        // Do something when long click is detected
        return true;
    }
});

三、长按事件的延迟设置

在实际开发中,需要根据需求对长按事件的延迟时间进行设置。默认的延迟时间是500ms,可以通过View类的setLongClickable()方法自定义长按事件的延迟时间。在下面的示例代码中,可以自定义长按事件的延迟时间为1秒:


imageView.setLongClickable(true);
imageView.setPressed(false);
imageView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        // Do something when long click is detected
        return true;
    }
});
imageView.setOnTouchListener(new View.OnTouchListener() {
    private Handler handler = new Handler();
    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            v.setPressed(true);
            v.performLongClick();
        }
    };

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                handler.postDelayed(runnable, 1000); //设置长按事件的延迟时间
                break;
            case MotionEvent.ACTION_UP:
                handler.removeCallbacks(runnable);
                v.setPressed(false);
                break;
            default:
                break;
        }
        return true;
    }
});

四、长按事件的取消

在实际开发中,有时候需要对长按事件进行取消。可以使用View类的setPressed()方法来取消长按事件的触发,在下面的示例代码中,可以在一定时间内取消长按事件,避免意外触发长按事件:


imageView.setLongClickable(true);
imageView.setPressed(false);
imageView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        // Do something when long click is detected
        return true;
    }
});
imageView.setOnTouchListener(new View.OnTouchListener() {
    private Handler handler = new Handler();
    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            v.setPressed(true);
            v.performLongClick();
        }
    };

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                handler.postDelayed(runnable, 1000); //设置长按事件的延迟时间
                break;
            case MotionEvent.ACTION_UP:
                handler.removeCallbacks(runnable);
                v.setPressed(false);
                break;
            default:
                break;
        }
        return true;
    }
});

五、长按事件的实例应用

长按事件可以应用于多种场景,例如应用市场、图库等。下面给出一个简单的应用实例,通过长按图标删除某一个应用:


imageView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setMessage("确认删除应用?");
        builder.setCancelable(false);
        builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                // Do something to delete the app
            }
        });
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        builder.show();
        return false;
    }
});

六、总结

通过本文的介绍,我们了解了长按事件的触发方式、延迟设置和取消方法。实际开发中,长按事件有着广泛的应用场景,在设计应用时可以结合业务需求进行灵活应用。