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

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

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

(0)

相关推荐

  • Android实现长按图片保存至相册功能

    前言:前面写了一篇reactnative的学习笔记,说reactnative的Android框架中有很多福利,确实是的,也说到了我们app中的一个把图片保存到相册的功能,好吧,还是准备写一篇博客,就当笔记了- 先上几张app的图片: 一进app就是一个进度条加载图片(我待会也会说一下进度条view跟怎么监听图片加载过程): 图片加载完毕后: 长按图片进入相册可以看到我们保存的图片: 监听图片加载的loaddingview源码(不是很难,我就直接贴代码了): package com.leo.cam

  • Android仿微信单击拍照长按录像功能实例代码

    此文章是看郭神公众号发的一篇,仅作学习. 在modlue gradle中添加 compile 'cjt.library.wheel:camera:0.0.7' 在project gradle中添加 compile 'cjt.library.wheel:camera:0.0.7' 添加的地方是 allprojects { repositories { jcenter() /*在此处添加*/ } } 使用起来很方便,只需在xml布局中 <com.cjt2325.cameralibrary.JCame

  • Android 再按一次返回键退出程序实现思路

    用户退出应用前给出一个提示是很有必要的,因为可能是用户并不真的想退出,而只是一不小心按下了返回键,大部分应用的做法是在应用退出去前给出一个Dialog,我觉得这样不太友好,用户还得移动手指去按dialog中的按钮.个人觉得"再按一次返回键退出程序"是best practice,实现也很简单,直接上代码: 复制代码 代码如下: private long exitTime = 0; @Override public boolean onKeyDown(int keyCode, KeyEve

  • Android开发实现长按返回键弹出关机框功能

    本文实例讲述了Android开发实现长按返回键弹出关机框功能.分享给大家供大家参考,具体如下: 今天刚好在PhoneWindowManager.java下看,当看到长按Home键的功能时,突然想到是不是可以长按back键来弹出关机框. 有想法就试试呗.当然想法是根据长按home键来的,那么我们应该可以模仿长按Home键来做.经过一番实验,貌似好像可以,拿出来给大家分享一下!!! 先找到PhoneWindowManager.java文件,在framework/base/policy/src/com

  • Android仿QQ长按删除弹出框功能示例

    废话不说,先看一下效果图,如果大家感觉不错,请参考实现代码: 对于列表来说,如果想操作某个列表项,一般会采用长按弹出菜单的形式,默认的上下文菜单比较难看,而QQ的上下文菜单就人性化多了,整个菜单给用户一种气泡弹出的感觉,而且会显示在手指按下的位置,而技术实现我之前是使用popupWindow和RecyclerView实现的,上面一个RecyclerView,下面一个小箭头ImageView,但后来发现没有必要,而且可定制化也不高,还是使用多个TextView更好一点. 我封装了一下,只需要一个P

  • Android中让按钮拥有返回键功能的方法及重写返回键功能

    让按钮拥有返回键的功能很简单,在点击事件加上finish();就OK了. 如: 复制代码 代码如下: public void onClick(View v){ finish(); } finish() 仅仅是把activity从当前的状态退出,但是资源并没有给清理. 其实android的机制决定了用户无法完全退出application,即使用System.exit(). android自己决定何时该从内存中释放程序,当系统没有可用内存时,就会按照一定的优先级来销毁应用程序. android手机操

  • 安卓(Android) 监听按键长按事件

    1,key -- 实体按键 现在手机物理按键越来越少 常见的有 KEYCODE_VOLUME_DOWN/UP KEYCODE_POWER KEYCODE_BACK KEYCODE_HOME KEYCODE_MENU 在一个activity 重载父类 的下面这三个方法来处理按键事件 public boolean onKeyDown(int keyCode, KeyEvent event): public boolean onKeyUp(int keyCode, KeyEvent event): p

  • Android实现长按back键退出应用程序的方法

    本文实例讲述了Android实现长按back键退出应用程序的方法.分享给大家供大家参考.具体分析如下: 最近在做一个Android上的应用,碰到一个问题就是如何实现长按back键退出应用程序.在网上查找了很多资料,发现几乎没有这样的实现,大部分在处理时是双击back键来退出应用程序.参考了一下双击back键退出应用程序的代码,网上主流的一种方法是下面这种方法,实现起来比较简单: @Override public boolean onKeyDown(int keyCode, KeyEvent ev

  • Android实现点击两次返回键退出

    在做安卓应用是我们经常要判断用户对返回键的操作,一般为了防止误操作都是在用户连续按下两次返回键的时候提示用户是否退出应用程序. 第一种实现的基本原理就是,当按下BACK键时,会被onKeyDown捕获,判断是BACK键,则执行exit方法. 在exit方法中,会首先判断isExit的值,如果为false的话,则置为true,同时会弹出提示,并在2000毫秒(2秒)后发出一个消息,在Handler中将此值还原成false.如果在发送消息间隔的2秒内,再次按了BACK键,则再次执行exit方法,此时

  • Android返回键功能的实现方法

    本文实例讲述了Android返回键功能的实现方法.分享给大家供大家参考.具体如下: 在开发android应用时,常常通过按返回键(即keyCode == KeyEvent.KEYCODE_BACK)就能关闭程序,其实大多情况下并没有关闭改应用 我们可以这样做,当用户点击自定义的退出按钮或返回键时(需要捕获动作),我们在onDestroy()里强制退出应用,或直接杀死进程,具体操作代码如下: public boolean onKeyDown(int keyCode, KeyEvent event)

  • Android双击返回键退出程序的实现方法

    本文实例讲述了Android双击返回键退出程序的实现方法,是Android程序开发中一个非常实用的功能,分享给大家供大家参考之用.具体方法如下: 一.实现思路: 用户按下返回键时设定一个定时器来监控是否2秒内实现了退出,如果用户没有接着按返回键,则清除第一次按返回键的效果,使程序还原到第一次按下返回键之前的状态.定时器是每次用户按下返回键才去创建. 二.功能代码: /** * 菜单.返回键响应 */ @Override public boolean onKeyDown(int keyCode,

随机推荐