Android自定義長按事件


Android系統自帶了長按事件,setOnLongClickListener即可監聽。但是有時候,你不希望用系統的長按事件,比如當希望長按的時間更長一點的時候。這時候就需要自己來定義這個長按事件了。 

package chroya.fun;  
   
import android.content.Context;  
import android.view.MotionEvent;  
import android.view.View;  
import android.view.ViewConfiguration;  
   
public class LongPressView1 extends View{  
    private int mLastMotionX, mLastMotionY;  
    //是否移動了  
    private boolean isMoved;  
    //是否釋放了  
    private boolean isReleased;  
    //計數器,防止多次點擊導致最后一次形成longpress的時間變短  
    private int mCounter;  
    //長按的runnable  
    private Runnable mLongPressRunnable;  
    //移動的閾值  
    private static final int TOUCH_SLOP = 20;  
   
    public LongPressView1(Context context) {  
        super(context);  
        mLongPressRunnable = new Runnable() {  
                
            @Override 
            public void run() {  
                mCounter--;  
                //計數器大於0,說明當前執行的Runnable不是最后一次down產生的。  
                if(mCounter>0 || isReleased || isMoved) return;  
                performLongClick();  
            }  
        };  
    }  
   
    public boolean dispatchTouchEvent(MotionEvent event) {  
        int x = (int) event.getX();  
        int y = (int) event.getY();  
            
        switch(event.getAction()) {  
        case MotionEvent.ACTION_DOWN:  
            mLastMotionX = x;  
            mLastMotionY = y;  
            mCounter++;  
            isReleased = false;  
            isMoved = false;  
            postDelayed(mLongPressRunnable, ViewConfiguration.getLongPressTimeout());  
            break;  
        case MotionEvent.ACTION_MOVE:  
            if(isMoved) break;  
            if(Math.abs(mLastMotionX-x) > TOUCH_SLOP   
                    || Math.abs(mLastMotionY-y) > TOUCH_SLOP) {  
                //移動超過閾值,則表示移動了  
                isMoved = true;  
            }  
            break;  
        case MotionEvent.ACTION_UP:  
            //釋放了  
            isReleased = true;  
            break;  
        }  
        return true;  
    }  


免責聲明!

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



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