Android自定义控件——自定义控件双击事件
本文介绍给自定义的控件加统一的双击监听事件,当然也可以对原生控件加
本文通过一个Button来演示
原理很简单,自定义一个接口 DoubleClickListener,定义抽象方法 onDoubleClick(View view);在touch事件中对 Button做具体的计算,通过两次计算系统时间的毫秒数的差值来判断是否是是双击。
自定义Button:
继承Button,构造方法中初始化clicktime的值,touch事件计算,定义接口和方法,定义给Button设置接口的方法
public class DoubleButton extends Button { DoubleClickListener mDoubleClickListener; private long mClick_time; public DoubleButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public DoubleButton(Context context, AttributeSet attrs) { super(context, attrs); init(); } public DoubleButton(Context context) { super(context); init(); } private void init() { mClick_time = System.currentTimeMillis(); Log.i("ABC", "mClick_time=" + System.currentTimeMillis()); } //<span style="font-family: 'Microsoft YaHei';font-size:14px;">给Button监听接口的方法</span> public void setOnDoubleClickListener( final DoubleClickListener mDoubleClickListener) { this.mDoubleClickListener = mDoubleClickListener; } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { long newClickTime = System.currentTimeMillis(); Log.i("ABC", "newClickTime=" + System.currentTimeMillis()); Log.i("ABC", "cha=" + (newClickTime - mClick_time)); if (newClickTime - mClick_time < 1000) {//调用双击事件 mDoubleClickListener.onDoubleClick(this); } mClick_time = newClickTime; } return super.onTouchEvent(event); } //接口 interface DoubleClickListener { public abstract void onDoubleClick(View view); } }
Xml中:
<RelativeLayout 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" > <com.example.test.DoubleButton android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="30dp" android:layout_marginTop="26dp" android:text="Button" /> </RelativeLayout>Activity中:
public class MainActivity extends ActionBarActivity { DoubleButton mButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = (DoubleButton) findViewById(R.id.button1);//监听,是不是和onclick一样啊好用啊 mButton.setOnDoubleClickListener(new DoubleClickListener() { @Override public void onDoubleClick(View view) { // TODO Auto-generated method stub Toast.makeText(getBaseContext(), "Down", Toast.LENGTH_SHORT) .show(); } }); } }
顺便加一个好用的防止连续点击的方法,加在点击事件中就可以用了。麻麻再也不用担心你的按钮被人狂点了
private static boolean isClick() { long time = System.currentTimeMillis(); long timeDur = time - mLastTime; if (timeDur > 500) { mLastTime = time; return true; } else { return false; } }