あい、クリック押した際のリピート処理をする方法でございます。
基本的にはHandlerとRunnableを使い実装するのが一般的?な感じだと思います。
んで同じようにRepeatListenerという便利なものがありますです。
stackoverflowのこちらとか参考
http://stackoverflow.com/questions/4284224/android-hold-button-to-repeat-action
ただこちらは、onClickでしか返ってこないため、
リピート終了したときが分からなかったりとちょいと使いづらいとこあります。
なので以下な感じにコールバックを独自のインターフェイスにしました。
public class RepeatClickListener implements OnTouchListener {
private Handler handler = new Handler();
private int initialInterval;
private final int normalInterval;
private final RepeatCallbacks mCallbacks;
public interface RepeatCallbacks {
void onClick(View v);
void onRepeatClick(View v);
void onEndClick(View v);
}
private Runnable handlerRunnable = new Runnable() {
@Override
public void run() {
handler.postDelayed(this, normalInterval);
mCallbacks.onRepeatClick(downView);
}
};
private View downView;
/**
* @param タップ後にリピートを開始する時間 initialInterval The interval after first click event
* @param リピートの間隔 normalInterval The interval after second and subsequent click
* events
* @param コールバック callbacks The RepeatCallbacks, that will be called
* periodically
*/
public RepeatClickListener(int initialInterval, int normalInterval,RepeatCallbacks callbacks) {
if (callbacks == null)
throw new IllegalArgumentException("null runnable");
if (initialInterval < 0 || normalInterval < 0)
throw new IllegalArgumentException("negative interval");
this.initialInterval = initialInterval;
this.normalInterval = normalInterval;
this.mCallbacks = callbacks;
}
@SuppressLint("ClickableViewAccessibility")
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
handler.removeCallbacks(handlerRunnable);
handler.postDelayed(handlerRunnable, initialInterval);
downView = view;
mCallbacks.onClick(view);
return true;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
handler.removeCallbacks(handlerRunnable);
mCallbacks.onEndClick(view);
downView = null;
return true;
}
return false;
}
}
使うときはこんな感じで。
View.setOnTouchListener(new RepeatClickListener(600, 300,callbacks);
RepeatCallbacks callbacks = new RepeatCallbacks() {
@Override
public void onClick(View v) {
//最初のクリック処理
}
@Override
public void onRepeatClick(View v) {
//リピート時の処理
}
@Override
public void onEndClick(View v) {
//終了時の処理
}
};
onClickは普通のクリックと一緒です。
onEndClickは終了時に呼ぶのでここででかめの更新があればすればいいんじゃないかな?みたいな。
ちなみにですが、第一引数を長めにとればロングクリック時にリピートするという感じにできます。
上では長めにとってます。
*時間はmsec(ミリセック 1秒=1000)です。
というわけで自分ようのメモということで。