简体   繁体   中英

How to use an onTouchListener to do two different tasks from the same button

I'm trying to make two buttons that will change add or subtract 1 from a value when tapped, and constantly add or subtract 1 ten times per second while the button is held. I can get the value to be changed when the button is tapped, or when it is held, but I can't get the behavior I want. Here's what I have:

btPlus.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                setTempo(mTempo + 1);
                mTempo=mTempo+1;
                tvTempo.setText(Integer.toString(mTempo));
                return true;
            }
            return false;
        }
    });
    btMinus.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                setTempo(mTempo - 1);
                mTempo=mTempo-1;
                tvTempo.setText(Integer.toString(mTempo));
                return true;
            }
            return false;
        }
    });
    btPlus.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            int action = motionEvent.getAction();
            switch (action) {
                case MotionEvent.ACTION_DOWN:
                    timer = new Timer();
                    timer.scheduleAtFixedRate(new TimerTask() {
                        @Override
                        public void run() {
                            if (getActivity() == null)
                                return;
                            getActivity().runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    tvTempo.setText(Integer.toString(mTempo));
                                    mTempo++;
                                    if (mTempo > 300)
                                        mTempo = 300;
                                }
                            });
                        }
                    }, 100, 100);
                    break;
                case MotionEvent.ACTION_UP:
                    timer.cancel();
            }
            return true;
        }
    });
    btMinus.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            int action = motionEvent.getAction();
            switch (action) {
                case MotionEvent.ACTION_DOWN:
                    timer = new Timer();
                    timer.scheduleAtFixedRate(new TimerTask() {
                        @Override
                        public void run() {
                            if (getActivity() == null)
                                return;
                            getActivity().runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    tvTempo.setText(Integer.toString(mTempo));
                                    mTempo--;
                                    if (mTempo < 1)
                                        mTempo = 1;
                                }
                            });
                        }
                    }, 100, 100);
                    break;
                case MotionEvent.ACTION_UP:
                    timer.cancel();
            }
            return true;
        }
    });
    return rootView;
}

Thanks for your help!

You can implement onKeyListener to determine how long button is held, like in this example:

Android long-touch event

or use onLongClickListener to perform a different function from a regular "click" like here:

On long click delete item

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM