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

 更新时间:2017年04月27日 10:03:48   投稿:lqh  
这篇文章主要介绍了 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();  
  }  
}  

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

相关文章

  • Flutter开发之设置应用名称及图标的教程

    Flutter开发之设置应用名称及图标的教程

    这篇文章主要介绍了Flutter设置应用名称及图标的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • 浅析Android App的相对布局RelativeLayout

    浅析Android App的相对布局RelativeLayout

    这篇文章主要介绍了Android App的相对布局RelativeLayout,文中举了一个登录界面的XML布局例子,非常直观,需要的朋友可以参考下
    2016-04-04
  • 解析activity之间数据传递方法的详解

    解析activity之间数据传递方法的详解

    本篇文章是对activity之间数据传递的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Android Studio实现简单的QQ登录界面的示例代码

    Android Studio实现简单的QQ登录界面的示例代码

    这篇文章主要介绍了Android Studio实现简单的QQ登录界面的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Android Studio使用ViewPager+Fragment实现滑动菜单Tab效果

    Android Studio使用ViewPager+Fragment实现滑动菜单Tab效果

    这篇文章主要为大家详细介绍了Android Studio使用ViewPager+Fragment实现滑动菜单Tab效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • Flutter模仿实现微信底部导航栏流程详解

    Flutter模仿实现微信底部导航栏流程详解

    这篇文章主要介绍了Flutter模仿实现微信底部导航栏流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-05-05
  • Android 沉浸式状态栏与隐藏导航栏实例详解

    Android 沉浸式状态栏与隐藏导航栏实例详解

    沉浸式状态栏是指状态栏与ActionBar颜色相匹配,隐藏导航栏,就是将导航栏隐藏,去掉下面的黑条。下面通过实例给大家详解android沉浸式状态栏与隐藏导航栏,感兴趣的朋友一起看看
    2017-07-07
  • Android实现注册页面

    Android实现注册页面

    这篇文章主要为大家详细介绍了Android实现注册页面之监听器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Android如何创建自定义ActionBar

    Android如何创建自定义ActionBar

    这篇文章主要教大家如何创建自定义的ActionBar,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Android开发改变字体颜色方法

    Android开发改变字体颜色方法

    用以下方法基本上可以解决大多数字体颜色设置问题,先发一篇,后续继续发一篇高级的,通过用户选择的方式,改变字体颜色。
    2015-05-05

最新评论