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

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

[java title=”MainActivity.java”]
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;
}
}
};
}
[/java]

Comments are closed.