Android自定義按鈕點擊事件和長按事件的區分

一個按鈕同時實現點擊和長按事件,有時候會有衝突,我們針對這一現象來自定義按鈕來區分點擊和長按事件

1.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.adfaf.MainActivity"
    android:orientation="vertical"
     >
 
    <huahua.btnlongtouch.LongTouchBtn  
       android:id="@+id/btn2"  
       android:layout_width="fill_parent"  
       android:layout_height="wrap_content"  
       android:text="自定義Btn" />  
     
   <TextView   
       android:id="@+id/tv1"  
       android:layout_width="wrap_content"  
       android:layout_height="wrap_content"  
       android:text="0"   
       />    
       <SeekBar 
           android:id="@+id/seekbar"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:max="100"
           
           />
     
 
</LinearLayout>


2.MainActivity中

public class MainActivity extends Activity {
 
     private TextView Tv1;  
        private LongTouchBtn Btn1;  
        private int num=0;
        private SeekBar sbar;  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);  
            sbar= (SeekBar) findViewById(R.id.seekbar);
            Tv1 = (TextView)findViewById(R.id.tv1);  
            Btn1 = (LongTouchBtn)findViewById(R.id.btn2);  
            Btn1.setOnClickListener(new View.OnClickListener() {  
                  
                @Override  
                public void onClick(View arg0) {  
                    Log.i("huahua", "自定義按鈕處理單擊");  
                      
                }  
            });  
            Btn1.setOnLongClickListener(new View.OnLongClickListener() {  
                  
                @Override  
                public boolean onLongClick(View v) {  
                    Log.i("huahua", "自定義按鈕處理長按一次相應");  
                    return true;  
                }  
            });  
              
            /**  
             * 這是一個自定義的接口 專門負責處理長按邏輯  
             *   @param listener  
             *            監聽器。  
             * @param time  
             *            第2個參數傳入1000 ,表示1秒處理一次onLongTouch()方法  
             */  
            Btn1.setOnLongTouchListener(new LongTouchListener() {  
                  
                @Override  
                public void onLongTouch() {  
                    num++;  
                    int seekbar_progress = sbar.getProgress();
                    Log.i("huahua", "seekbar_progress="+seekbar_progress); 
                    seekbar_progress++;
                    sbar.setProgress(seekbar_progress);
                    Tv1.setText(num+"");  
                    Log.i("huahua", "正在長按");  
                      
                }  
            },1000);  
        }  
}


3.新建一個自定義的LongTouchBtn類

public class LongTouchBtn extends Button{  
    
    /**  
     * 記錄當前自定義Btn是否按下  
     */  
    private boolean clickdown = false;  
      
    /**  
     * 下拉刷新的回調接口  
     */  
    private LongTouchListener mListener;  
      
    /**  
     * 按鈕長按時 間隔多少毫秒來處理 回調方法   
     */  
    private int mtime;  
      
    /**  
     * 構造函數  
     * @param context  
     * @param attrs  
     */  
    public LongTouchBtn(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        // TODO Auto-generated constructor stub  
    }  
  
    /**  
     * 處理touch事件  
     */  
    @Override  
    public boolean onTouchEvent(MotionEvent event) {  
        if(event.getAction() == MotionEvent.ACTION_DOWN)  
        {  
            clickdown = true;  
            new LongTouchTask().execute();  
  
            Log.i("huahua", "按下");  
        }  
        else if(event.getAction() == MotionEvent.ACTION_UP)  
        {  
            clickdown = false;  
            Log.i("huahua", "彈起");  
        }  
        return super.onTouchEvent(event);  
    }  
  
    /**  
     * 使當前線程睡眠指定的毫秒數。  
     *   
     * @param time  
     *            指定當前線程睡眠多久,以毫秒爲單位  
     */  
    private void sleep(int time) {  
        try {  
            Thread.sleep(time);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
    }  
      
    /**  
     * 處理長按的任務  
     */  
    class  LongTouchTask extends AsyncTask<Void, Integer, Void>{  
  
        @Override  
        protected Void doInBackground(Void... params) {  
            while(clickdown)  
            {  
                sleep(mtime);  
                publishProgress(0);  
            }  
            return null;  
        }  
  
        @Override  
        protected void onPostExecute(Void result) {  
  
        }  
  
        @Override  
        protected void onProgressUpdate(Integer... values) {  
            mListener.onLongTouch();  
        }  
          
    }  
      
    /**  
     * 給長按btn控件註冊一個監聽器。  
     *   
     * @param listener  
     *            監聽器的實現。  
     * @param time  
     *            多少毫秒時間間隔 來處理一次回調方法  
     */  
    public void setOnLongTouchListener(LongTouchListener listener, int time) {  
        mListener = listener;  
        mtime = time;  
          
    }  
      
    /**  
     * 長按監聽接口,使用按鈕長按的地方應該註冊此監聽器來獲取回調。  
     */  
    public interface LongTouchListener {  
  
        /**  
         * 處理長按的回調方法  
         */  
        void onLongTouch();  
    }  
}  

————————————————
版權聲明:本文爲CSDN博主「不放棄的泉」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wu371894545/article/details/53525282

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章