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

发布时间 - 2026-01-11 00:51:39    点击率:

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

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


# Android  # 自定义按钮点击事件和长按事件  # 自定义按钮  # Android MenuItem 自定义长按事件的实现  # 安卓(Android) 监听按键长按事件  # Android ExpandableListView长按事件的完美解决办法  # Android组件ContextMenu实现长按事件  # 自定义  # 回调  # 按下  # 这一  # 会有  # 这是一个  # 希望能  # 谢谢大家  # 单击  # 新建一个  # 多久  # max  # java  # public  # extends  # Btn  # text  # private  # TextView  # seekbar 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何撰写建站申请书?关键要点有哪些?  千库网官网入口推荐 千库网设计创意平台入口  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何在服务器上三步完成建站并提升流量?  简历在线制作网站免费版,如何创建个人简历?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  JavaScript如何操作视频_媒体API怎么控制播放  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Laravel如何为API编写文档_Laravel API文档生成与维护方法  android nfc常用标签读取总结  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  如何在搬瓦工VPS快速搭建网站?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  iOS发送验证码倒计时应用  如何在建站主机中优化服务器配置?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  java ZXing生成二维码及条码实例分享  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  LinuxShell函数封装方法_脚本复用设计思路【教程】  Laravel如何使用Eloquent进行子查询  如何快速搭建安全的FTP站点?  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  Java类加载基本过程详细介绍  如何获取PHP WAP自助建站系统源码?  如何用PHP工具快速搭建高效网站?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  英语简历制作免费网站推荐,如何将简历翻译成英文?  清除minerd进程的简单方法  Python文件操作最佳实践_稳定性说明【指导】  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  bootstrap日历插件datetimepicker使用方法  北京专业网站制作设计师招聘,北京白云观官方网站?  在线制作视频的网站有哪些,电脑如何制作视频短片?  Android仿QQ列表左滑删除操作  Laravel Session怎么存储_Laravel Session驱动配置详解  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  Laravel怎么使用Intervention Image库处理图片上传和缩放  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Python高阶函数应用_函数作为参数说明【指导】  文字头像制作网站推荐软件,醒图能自动配文字吗?