簡體   English   中英

在textview上應用雙擊不起作用

[英]Apply double tap on textview is not working

我想在雙擊TextView時觸發某些事件。

final GestureDetector gestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener() {
    public boolean onDoubleTap(MotionEvent e) {
        Log.e("", "Open new activty here");
        return true;
    }
});
TextView tv = (TextView) findViewById(R.id.editTextID);
tv.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }
});

這將返回ontapevent

您可能需要創建新的Class實現Onclick。 正常點擊將延遲400毫秒,直到使用Timer檢測到第二次點擊為止。 如果不存在400毫秒后的第二次單擊,它將考慮“一鍵式”

public abstract class DoubleClickListener implements OnClickListener {

    private Timer timer = null;  //at class level;
    private int DELAY   = 400;

    private static final long DOUBLE_CLICK_TIME_DELTA = 300;//milliseconds

    long lastClickTime = 0;

    @Override
    public void onClick(View v) {
        long clickTime = System.currentTimeMillis();
        if (clickTime - lastClickTime < DOUBLE_CLICK_TIME_DELTA){
            processDoubleClickEvent(v);
        } else {
            processSingleClickEvent(v);
        }
        lastClickTime = clickTime;
    }



    public void processSingleClickEvent(final View v){

       final Handler handler=new Handler();
       final Runnable mRunnable=new Runnable(){
            public void run(){
                onSingleClick(v); //Do what ever u want on single click
            }
       };

       TimerTask timertask=new TimerTask(){
            @Override
            public void run(){
                    handler.post(mRunnable);
            }
       };
       timer=new Timer();
       timer.schedule(timertask,DELAY);
    }


    public void processDoubleClickEvent(View v){
        if(timer!=null)
        {
             timer.cancel(); //Cancels Running Tasks or Waiting Tasks.
             timer.purge();  //Frees Memory by erasing cancelled Tasks.
        }

        onDoubleClick(v);//Do what ever u want on Double Click
    }

    public abstract void onSingleClick(View v);

    public abstract void onDoubleClick(View v);
}

如何使用

view.setOnClickListener(new DoubleClickListener() {

            @Override
            public void onSingleClick(View v) {

            }

            @Override
            public void onDoubleClick(View v) {
                 // Your code here
            }
        });

懶惰的實現之一

private static final long DOUBLE_CLICK_TIME_DELTA = 300;//milliseconds

long lastClickTime = 0;

TextView tv = (TextView) findViewById(R.id.editTextID);
tv.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        long clickTime = System.currentTimeMillis();
    if (clickTime - lastClickTime < DOUBLE_CLICK_TIME_DELTA){
        lastClickTime = 0;
        //double click
    } else {
        //single click
    }
    lastClickTime = clickTime;
    }
});

但如果反復使用雙擊,請不要偷懶。 走更好的方法..創建一個抽象類繼續。

public abstract class DoubleClickListener implements OnClickListener {

private static final long DOUBLE_CLICK_TIME_DELTA = 300;//milliseconds

long lastClickTime = 0;

@Override
public void onClick(View v) {
    long clickTime = System.currentTimeMillis();
    if (clickTime - lastClickTime < DOUBLE_CLICK_TIME_DELTA){
        onDoubleClick(v);
        lastClickTime = 0;
    } else {
        onSingleClick(v);
    }
    lastClickTime = clickTime;
}

    public abstract void onSingleClick(View v);
    public abstract void onDoubleClick(View v);
}

隨處使用

view.setOnClickListener(new DoubleClickListener() {

    @Override
    public void onSingleClick(View v) {

    }

    @Override
    public void onDoubleClick(View v) {

    }
});

快樂編碼

您需要實現我認為的所有功能,使用此代碼:

final GestureDetector gd = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener(){
   //here is the method for double tap
    @Override
    public boolean onDoubleTap(MotionEvent e) {

        //your action here for double tap e.g.
        //Log.d("OnDoubleTapListener", "onDoubleTap");

        return true;
    }

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

    }

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

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


});

//here yourView is the View on which you want to set the double tap action

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

        return gd.onTouchEvent(event);
    }
});

話說回來,在Android中,改用longclick更為常見,

希望能幫助到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM