之前简单介绍了接口的回调,在android开发的过程中,我们常常遇到setOnClickListener,里面放一个接口,等待触发的时候回调
这里我写个demo,用来判断用户双击的操作,我把名字成为setOnDoubleClickListener
下面大改结合代码讲一下如何实现。
首先,要有个接口对吧,就叫OnDoubleClickListener吧。
package com.example.appdemo;
import android.view.View;
/**
* 双击的接口监听
*
* @author leafact
*
*/
public interface OnDoubleClickListener {
public void OnDoubleClick(View v);
}
要想有这种效果,我们需要自定义一个控件,继承TextView的MyTextView吧,注意点写代码里
package com.example.appdemo;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.TextView;
/**
* 自定义控件,加入双击
*
* @author leafact
*
*/
public class MyTextView extends TextView {
// 私有的监听接口
private OnDoubleClickListener mListener;
private long lastClickTimeMillis = 0;
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
// 设置监听
public void setOnDoubleClickListener(OnDoubleClickListener listener) {
mListener = listener;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i("test", "ACTION_DOWN");
long temp = System.currentTimeMillis();
if (mListener != null
&& Math.abs(temp - lastClickTimeMillis) < 1000) {
// mListener必须设置过监听才可以,所以需要判断mListener是否为null
mListener.OnDoubleClick(this);
}
lastClickTimeMillis = temp;
break;
default:
break;
}
// 必须为扩展重写,开始认为应该返回false,为true表示事件拦截。
// 但是如果自己返回true或者false,onTouchEvent就完全被重写了,父类的监听,如onClickListener就监听不到了
// 主要的事要说三遍,扩展重写,扩展重写,扩展重写。
return super.onTouchEvent(event);
}
}
对应的布局
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<com.example.appdemo.MyTextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="双击查看效果" />
</RelativeLayout>
activity中
package com.example.appdemo;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private MyTextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (MyTextView) findViewById(R.id.textView);
tv.setOnDoubleClickListener(new OnDoubleClickListener() {
@Override
public void OnDoubleClick(View v) {
Toast.makeText(MainActivity.this, "1秒内点击两次,你双击了",
Toast.LENGTH_SHORT).show();
}
});
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "单击", Toast.LENGTH_SHORT)
.show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
效果图:单击只显示Toast为单击,一秒内点击两次,将会先弹出
单机
1秒内点击两次,你双击了
单击
效果图:
=================================
欢迎交流