Android實現雙擊事件的兩種方式


Work around的方法是先監聽onTouch事件來監聽連續點擊次數,每次點擊都布置一個間隔時間的延時任務,延時任務執行時判斷間隔內是否還有點擊,如果沒有則發布點擊次數,重置計數。

實現代碼如下:

/**
 * 連續點擊事件監聽器 可以用作雙擊事件
 * 
 */
public abstract class OnMultiTouchListener implements OnTouchListener {
    /**
     * 上次 onTouch 發生的時間
     */
    private long lastTouchTime = 0;
    /**
     * 已經連續 touch 的次數
     */
    private AtomicInteger touchCount = new AtomicInteger(0);

    private Runnable mRun = null;

    public void removeCallback() {
        if (mRun != null) {
       getMainLoopHandler().removeCallbacks(mRun);
            mRun = null;
        }
    }

    @Override
    public boolean onTouch(final View v, final MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            final long now = System.currentTimeMillis();
            lastTouchTime = now;

            touchCount.incrementAndGet();
       //每點擊一次就移除上一次的延遲任務,重新布置一個延遲任務
            removeCallback();

            mRun = new Runnable() {
                @Override
                public void run() {
            //兩個變量相等,表示時隔 multiTouchInterval之后沒有新的touch產生, 觸發事件並重置touchCount
if (now == lastTouchTime) { onMultiTouch(v, event, touchCount.get()); touchCount.set(0); } } }; postTaskInUIThread(mRun, getMultiTouchInterval()); } return true; } /** * 連續touch的最大間隔, 超過該間隔將視為一次新的touch開始, 默認是400,推薦值,也可以由客戶代碼指定 * * @return */ protected int getMultiTouchInterval() { return 400; } /** * 連續點擊事件回調 * * @param v * @param event * @param touchCount * 連續點擊的次數 * @return */ public abstract void onMultiTouch(View v, MotionEvent event, int touchCount); }

使用代碼:

mView.setOnTouchListener( new OnMultiTouchListener() {
        @Override
        public void onMultiTouch(View v, MotionEvent event, int touchCount) {
            if (touchCount == 2) {
              //雙擊
            }
        }
    });

 

簡潔直接的方法是用GestureDector類:

mView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                GestureDetector detector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {

                    @Override
                    public boolean onSingleTapUp(MotionEvent e) {
                        return super.onSingleTapUp(e);
                    }

                    @Override
                    public void onLongPress(MotionEvent e) {
                        super.onLongPress(e);
                    }

                    @Override
                    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                        return super.onScroll(e1, e2, distanceX, distanceY);
                    }

                    @Override
                    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                        return super.onFling(e1, e2, velocityX, velocityY);
                    }

                    @Override
                    public void onShowPress(MotionEvent e) {
                        super.onShowPress(e);
                    }

                    @Override
                    public boolean onDown(MotionEvent e) {
                        return super.onDown(e);
                    }

                    @Override
                    public boolean onDoubleTap(MotionEvent e) {
                        return super.onDoubleTap(e);
                    }

                    @Override
                    public boolean onDoubleTapEvent(MotionEvent e) {
                        return super.onDoubleTapEvent(e);
                    }

                    @Override
                    public boolean onSingleTapConfirmed(MotionEvent e) {
                        return super.onSingleTapConfirmed(e);
                    }

                    @Override
                    public boolean onContextClick(MotionEvent e) {
                        return super.onContextClick(e);
                    }
                });
                detector.onTouchEvent(event);

                return false;
            }
        });

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM