반응형

키보드에서 특정 키를 꾹 누르고 있으면 그 키에 해당하는 문자가 계속 타이핑 되듯이 

안드로이드에서도 특정 버튼을 누르면 어떠한 액션이 반복적으로 실행되는 리스너를 찾아보았습니다. 

 

원본 링크 : 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은 반복속도입니다. 자유롭게 주셔도 됩니다.


반응형
,