Android 长按控件连续不断触发事件

前言

从前,有一个数字,有两个好伙伴,一个是加按钮,另一个是减按钮加按钮被点击的时候,数字就会加一,减按钮被点击的时候,数字就会减一,而加按钮一直被按着的时候,数字就会一直加一;同理,减按钮一直被按着的时候,数字就会一直减一。
在这里插入图片描述

可配合输入框范围限制,实现一个可编辑的输入需求。
Android EditText输入框限制输入数值范围
android EditText输入框限制输入数字大小,一个页面内多次调整范围

xml

布局文件如下:

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/btn_less"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="减1" />

                <TextView
                    android:id="@+id/txt_num"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:text="0" />

                <Button
                    android:id="@+id/btn_add"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="加1" />
            </LinearLayout>

声明控件

txtNum = findViewById(R.id.txt_num);
btnLess = findViewById(R.id.btn_less);
btnAdd = findViewById(R.id.btn_add);

加一方法

    /**
     * 加
     */
    @SuppressLint("SetTextI18n")
    private void add() {
        int num = Integer.parseInt(txtNum.getText().toString());
        num ++;
        txtNum.setText(num + "");
    }

减一方法

    /**
     * 减
     */
    @SuppressLint("SetTextI18n")
    private void less() {
        int num = Integer.parseInt(txtNum.getText().toString());
        if (num != 0) {
            num --;
            txtNum.setText(num + "");
        }
    }

点击事件

        // 点击事件
        btnLess.setOnClickListener(onClickListener);
        btnAdd.setOnClickListener(onClickListener);
    /**
     * 点击
     */
    private View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_less:
                    // 单点减
                    less();
                    break;
                case R.id.btn_add:
                    // 单点加
                    add();
                    break;
            }
        }
    };

长按事件

        // 长按事件
        btnLess.setOnLongClickListener(onLongClickListener);
        btnAdd.setOnLongClickListener(onLongClickListener);
    /**
     * 长按
     */
    private View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            mBtnTouchMap.put(v.getId(), true);
            mHandler.sendEmptyMessage(LONG_CLICK);
            return false;
        }
    };

触摸事件

        // 触摸事件
        btnLess.setOnTouchListener(onTouchListener);
        btnAdd.setOnTouchListener(onTouchListener);
    /**
     * 触摸
     * 监听手指抬起,长按结束
     */
    private View.OnTouchListener onTouchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_UP:
                    // 手指举起
                    mBtnTouchMap.put(v.getId(), false);
                    break;
            }
            return false;
        }
    };

数据记录与按时执行

    /** 长按标记,记录每个按钮是否正在按着 */
    private SparseArray<Boolean> mBtnTouchMap = new SparseArray<>();
    /** handler标记 */
    private static final int LONG_CLICK = 10001;
    /** 处理 */
    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case LONG_CLICK:
                    for (int i = 0; i < mBtnTouchMap.size(); i++) {
                        int viewId = mBtnTouchMap.keyAt(i);
                        // 长按结束,就不再继续往下走了
                        if (!mBtnTouchMap.valueAt(i)) continue;
                        switch (viewId) {
                            case R.id.btn_less:
                                less();
                                break;
                            case R.id.btn_add:
                                add();
                                break;
                        }
                        // 每隔150毫秒做一次
                        mHandler.sendEmptyMessageDelayed(LONG_CLICK, 150);
                    }
                    break;
            }
        }
    };

完事

发布了103 篇原创文章 · 获赞 31 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/sinat_38184748/article/details/100104161