java - Android long-touch event -
i have 2 buttons increment , decrement value 1 each press , they're working fine onclicklistener. see onlongclicklistener exists, assume touch , hold events. how have number rapidly increment/decrement if button held?
am correct in assuming onlongclicklistener fires once per long click? there more appropriate listener or property somewhere i'm not aware of?
you may implement in following code.
package org.me.rapidchange; import android.app.activity; import android.os.bundle; import android.os.handler; import android.os.message; import android.util.log; import android.view.keyevent; import android.view.motionevent; import android.view.view; import android.view.view.onclicklistener; import android.view.view.onkeylistener; import android.view.view.ontouchlistener; import android.widget.button; import android.widget.textview; import java.util.concurrent.executors; import java.util.concurrent.scheduledexecutorservice; import java.util.concurrent.timeunit; public class mainactivity extends activity implements onkeylistener, ontouchlistener, onclicklistener { private class updatecountertask implements runnable { private boolean minc; public updatecountertask(boolean inc) { minc = inc; } public void run() { if (minc) { mhandler.sendemptymessage(msg_inc); } else { mhandler.sendemptymessage(msg_dec); } } } private static final int msg_inc = 0; private static final int msg_dec = 1; private button mincbutton; private button mdecbutton; private textview mtext; private int mcounter; private handler mhandler; private scheduledexecutorservice mupdater; /** called when activity first created. */ @override public void oncreate(bundle icicle) { super.oncreate(icicle); setcontentview(r.layout.main); mhandler = new handler() { @override public void handlemessage(message msg) { switch (msg.what) { case msg_inc: inc(); return; case msg_dec: dec(); return; } super.handlemessage(msg); } }; mincbutton = (button) findviewbyid(r.id.inc_button); mdecbutton = (button) findviewbyid(r.id.dec_button); mtext = (textview) findviewbyid(r.id.text); mincbutton.setontouchlistener(this); mincbutton.setonkeylistener(this); mincbutton.setonclicklistener(this); mdecbutton.setontouchlistener(this); mdecbutton.setonkeylistener(this); mdecbutton.setonclicklistener(this); } private void inc() { mcounter++; mtext.settext(integer.tostring(mcounter)); } private void dec() { mcounter--; mtext.settext(integer.tostring(mcounter)); } private void startupdating(boolean inc) { if (mupdater != null) { log.e(getclass().getsimplename(), "another executor still active"); return; } mupdater = executors.newsinglethreadscheduledexecutor(); mupdater.scheduleatfixedrate(new updatecountertask(inc), 200, 200, timeunit.milliseconds); } private void stopupdating() { mupdater.shutdownnow(); mupdater = null; } public void onclick(view v) { if (mupdater == null) { if (v == mincbutton) { inc(); } else { dec(); } } } public boolean onkey(view v, int keycode, keyevent event) { boolean iskeyofinterest = keycode == keyevent.keycode_dpad_center || keycode == keyevent.keycode_enter; boolean isreleased = event.getaction() == keyevent.action_up; boolean ispressed = event.getaction() == keyevent.action_down && event.getaction() != keyevent.action_multiple; if (iskeyofinterest && isreleased) { stopupdating(); } else if (iskeyofinterest && ispressed) { startupdating(v == mincbutton); } return false; } public boolean ontouch(view v, motionevent event) { boolean isreleased = event.getaction() == motionevent.action_up || event.getaction() == motionevent.action_cancel; boolean ispressed = event.getaction() == motionevent.action_down; if (isreleased) { stopupdating(); } else if (ispressed) { startupdating(v == mincbutton); } return false; } }
Comments
Post a Comment