欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 自定义按钮点击事件和长按事件对比

程序员文章站 2023-11-21 15:19:58
 android 自定义按钮点击事件和长按事件对比 一个按钮同时实现点击和长按事件,有时候会有冲突,我们针对这一现象来自定义按钮来区分点击和长按事件 1....

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

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!