Android自定义控件——自定义控件双击事件

本文介绍给自定义的控件加统一的双击监听事件,当然也可以对原生控件加

本文通过一个Button来演示

原理很简单,自定义一个接口 DoubleClickListener,定义抽象方法  onDoubleClick(View view);在touch事件中对 Button做具体的计算,通过两次计算系统时间的毫秒数的差值来判断是否是是双击。

 

自定义Button:

继承Button,构造方法中初始化clicktime的值,touch事件计算,定义接口和方法,定义给Button设置接口的方法

 

[java] view plain copy
 
  1. public class DoubleButton extends Button {  
  2.   
  3.     DoubleClickListener mDoubleClickListener;  
  4.     private long mClick_time;  
  5.   
  6.     public DoubleButton(Context context, AttributeSet attrs, int defStyle) {  
  7.         super(context, attrs, defStyle);  
  8.         init();  
  9.     }  
  10.   
  11.     public DoubleButton(Context context, AttributeSet attrs) {  
  12.         super(context, attrs);  
  13.         init();  
  14.     }  
  15.   
  16.     public DoubleButton(Context context) {  
  17.         super(context);  
  18.         init();  
  19.     }  
  20.   
  21.     private void init() {  
  22.         mClick_time = System.currentTimeMillis();  
  23.         Log.i("ABC", "mClick_time=" + System.currentTimeMillis());  
  24.     }  
  25.         //<span style="font-family: 'Microsoft YaHei';font-size:14px;">给Button监听接口的方法</span>  
  26.     public void setOnDoubleClickListener(  
  27.             final DoubleClickListener mDoubleClickListener) {  
  28.         this.mDoubleClickListener = mDoubleClickListener;  
  29.     }  
  30.   
  31.     @Override  
  32.     public boolean onTouchEvent(MotionEvent event) {  
  33.         if (event.getAction() == MotionEvent.ACTION_DOWN) {  
  34.             long newClickTime = System.currentTimeMillis();  
  35.             Log.i("ABC", "newClickTime=" + System.currentTimeMillis());  
  36.             Log.i("ABC", "cha=" + (newClickTime - mClick_time));  
  37.             if (newClickTime - mClick_time < 1000) {//调用双击事件  
  38.                 mDoubleClickListener.onDoubleClick(this);  
  39.   
  40.             }  
  41.             mClick_time = newClickTime;  
  42.         }  
  43.         return super.onTouchEvent(event);  
  44.     }  
  45.         //接口  
  46.     interface DoubleClickListener {  
  47.         public abstract void onDoubleClick(View view);  
  48.     }  
  49. }  

 

 

在界面中使用

Xml中:

[html] view plain copy
 
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <com.example.test.DoubleButton  
  7.         android:id="@+id/button1"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_alignParentLeft="true"  
  11.         android:layout_alignParentTop="true"  
  12.         android:layout_marginLeft="30dp"  
  13.         android:layout_marginTop="26dp"  
  14.         android:text="Button" />  
  15.   
  16. </RelativeLayout>  

Activity中:

 

 

[java] view plain copy
 
  1. public class MainActivity extends ActionBarActivity {  
  2.   
  3.     DoubleButton mButton;  
  4.   
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.activity_main);  
  9.         mButton = (DoubleButton) findViewById(R.id.button1);//监听,是不是和onclick一样啊好用啊  
  10.         mButton.setOnDoubleClickListener(new DoubleClickListener() {  
  11.   
  12.             @Override  
  13.             public void onDoubleClick(View view) {  
  14.                 // TODO Auto-generated method stub  
  15.                 Toast.makeText(getBaseContext(), "Down", Toast.LENGTH_SHORT)  
  16.                         .show();  
  17.             }  
  18.         });  
  19.     }  
  20.   
  21. }  


顺便加一个好用的防止连续点击的方法,加在点击事件中就可以用了。麻麻再也不用担心你的按钮被人狂点了

 

 

[java] view plain copy
 
    1. private static boolean isClick() {  
    2.         long time = System.currentTimeMillis();  
    3.         long timeDur = time - mLastTime;  
    4.   
    5.         if (timeDur > 500) {  
    6.             mLastTime = time;  
    7.             return true;  
    8.         } else {  
    9.             return false;  
    10.         }  
    11.   
    12.     }  
posted @ 2017-04-26 13:56  天涯海角路  阅读(110)  评论(0)    收藏  举报