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();  
    }  
}  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值