ボタンを長押しで連続イベント

ボタンを押し続けている間に、イベントが連続発生するようなものは存在しないので、
以下の用に長押しイベントを小刻みに中断させることによって、連続でイベントが発生しているように見せる仕組みにする。
タッチイベントとロングクリックイベントの組み合わせです。
これ以外には簡単な方法はなさそう。
Threadや、Runnableや、Hundlerが出てきますが、初心者では難しいので理解しないで使うのが無難

public class MainActivity
 extends Activity implements OnTouchListener, OnLongClickListener{

TextView count_text;
Button plus_button;
Button minus_button;
 
Thread cntThread;
int intCount = 0;
boolean repeatFlg= false;
 
    //最初のonCreateイベント
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        //メインレイアウトを取得
        setContentView(R.layout.main_activity);
 
        //各ビューを取得
        count_text = (TextView) findViewById(R.id.count_text);
        plus_button = (Button)findViewById(R.id.plus_button);
        minus_button = (Button)findViewById(R.id.minus_button);

        //ボタンにonTouchイベントを設定
        plus_button.setOnTouchListener(this);
        minus_button.setOnTouchListener(this);

        //ボタンにonLongClkickイベントを設定
        plus_button.setOnLongClickListener(this);
        minus_button.setOnLongClickListener(this);
    }

    //onTouchのイベント
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        //onTouchは、画面を押した時と、離した時の両方のイベントを取得する
        int action = event.getAction();
        switch(action) {
            //ボタンから指が離れた時
            case MotionEvent.ACTION_UP:
            //連続イベントフラグをfalse
            isRepeat = false;
            break;
        }
        return false;
    }

    //onLongClickのイベント
    @Override
    public boolean onLongClick(View v) {
        switch(v) {
        case plus_button:
            //連続イベントフラグをtrue
            isRepeat = true;
            //連続プラススレッド
            cntThread = new Thread(repeatPlus);
            //連続イベント開始
            cntThread.start();
            break;
        case minus_button:
            //連続イベントフラグをtrue
            isRepeat = true;
            //連続マイナス
            cntThread = new Thread(repeatMinus);
            //連続イベント開始
            cntThread.start();
            break;
        }
        return true;
    }

    //連続プラス
    private Runnable repeatPlus = new Runnable(){
        @Override
        public void run(){
            while(repeatFlg){
                try{
                    Thread.sleep(100); //0.1秒イベント中断。値が小さいほど、高速で連続する
                }catch(InterruptedException e){
                }
                count++;
                handler.post(new Runnable(){
                    @Override
                    public void run(){
                        //カウントプラスを呼び出し
                        cntPlus();
                    }
                });
            }
        }
    };

    //カウントをプラスするメソッド
    private void cntPlus() {
        intCount++;
        count_text.setText(String.valueOf(intCount));
    }

    //連続マイナス
    private Runnable repeatMinus = new Runnable(){
        @Override
        public void run(){
            while(repeatFlg){
                try{
                    Thread.sleep(100);  //0.1秒イベント中断
                }catch(InterruptedException e){
                }
                count++;
                handler.post(new Runnable(){
                    @Override
                    public void run(){
                        //カウントマイナスを呼び出し
                        cntMinus();
                    }
                });
            }
        }
    };

    //カウントをマイナスするメソッド
    private void cntMinus() {
        intCount--;
        count_text.setText(String.valueOf(intCount));
    }
 
    //ハンドラー
    private Handler handler = new Handler(){
        public void handleMessage(Message msg){
            if(cntThread != null){
                cntThread.stop();
                cntThread=null;
            }
        }
    };
}

Comments are closed.