키보드에서 특정 키를 꾹 누르고 있으면 그 키에 해당하는 문자가 계속 타이핑 되듯이
안드로이드에서도 특정 버튼을 누르면 어떠한 액션이 반복적으로 실행되는 리스너를 찾아보았습니다.
원본 링크 : http://stackoverflow.com/questions/4284224/android-hold-button-to-repeat-action
이곳에 보면 버튼 반복 방법이 두가지 나오는데요, 첫번째 보다 두번째 방식이 더 간결하고 쓰기 좋습니다.
(첫번째 방법은 버튼 셀렉터 먹이기가 힘들더군요 ㅇㅁㅇ;)
일단 RepeatListener.java 를 생성합니다.
import android.os.Handler; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener;
/** * A class, that can be used as a TouchListener on any view (e.g. a Button). * It cyclically runs a clickListener, emulating keyboard-like behaviour. First * click is fired immediately, next after initialInterval, and subsequent after * normalInterval. * * <p>Interval is scheduled after the onClick completes, so it has to run fast. * If it runs slow, it does not generate skipped onClicks. */ public class RepeatListener implements OnTouchListener {
private Handler handler = new Handler();
private int initialInterval; private final int normalInterval; private final OnClickListener clickListener;
private Runnable handlerRunnable = new Runnable() { @Override public void run() { handler.postDelayed(this, normalInterval); clickListener.onClick(downView); } };
private View downView;
/** * @param initialInterval The interval after first click event * @param normalInterval The interval after second and subsequent click * events * @param clickListener The OnClickListener, that will be called * periodically */ public RepeatListener(int initialInterval, int normalInterval, OnClickListener clickListener) { if (clickListener == null) throw new IllegalArgumentException("null runnable"); if (initialInterval < 0 || normalInterval < 0) throw new IllegalArgumentException("negative interval");
this.initialInterval = initialInterval; this.normalInterval = normalInterval; this.clickListener = clickListener; }
public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: handler.removeCallbacks(handlerRunnable); handler.postDelayed(handlerRunnable, initialInterval); downView = view; clickListener.onClick(view); break; case MotionEvent.ACTION_UP: handler.removeCallbacks(handlerRunnable); downView = null; break;
case MotionEvent.ACTION_CANCEL: handler.removeCallbacks(handlerRunnable); downView = null; break;
} return false; } } |
그후 onCreate()에 Button 리스너를 줍니다.
((Button)findViewById(R.id.btn)).setOnTouchListener(new RepeatListener(400, 50, new OnClickListener() { @Override public void onClick(View view) { //할 것!! } })); |
여기서 400은 처음 터치한 후 반복이 실행되기 까지의 대기시간, 50은 반복속도입니다. 자유롭게 주셔도 됩니다.
'Tech develop > Android' 카테고리의 다른 글
[안드로이드/android]Exception, StackOverflowError에 대하여 (0) | 2014.08.10 |
---|---|
[안드로이드/android]인터넷 연결 여부 확인 (0) | 2014.08.10 |
[Android/안드로이드]기본 카메라 및 갤러리 에서 사진 불러오기 (0) | 2014.08.10 |
[Android/안드로이드]java.lang.NullPointerException 에러 (0) | 2014.08.10 |
[Android/안드로이드] .9.png(9patch) 사용 법 (0) | 2014.08.10 |