今天在论坛被一个问题难住了,有个哥们发帖子,问如何把MotionEvent.ACTION_DOWN变成长按事件,实际也就是用MotionEvent.ACTION_DOWN来代替OnLongClickListener,而且需要自定义按下多长时间后执行.这个在以前还真是没做过,那么今天就这个问题来做个小例子吧!
首先创建一个项目,这个很简单了,不必再提.直接附上布局代码:
activity_main:
<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="com.example.longpresstoast.MainActivity" >
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"
android:background="@android:color/holo_blue_bright"/>
</RelativeLayout>
这个简单修改一下就可以了,那么附上MainActivity中的关键部分:
首先我们要找到这个TextView,代码如下:
tvContent = (TextView) findViewById(R.id.tv_content);
tvContent.setOnTouchListener(this);
这里设置的是OnTouchListener,是不是很熟悉啊,那么这么写就需要你的Activity实现OnTouchListener接口中的回调方法--onTouch,代码如下:
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
lpt = new LongPressedToast();
handler.postDelayed(lpt,LONG_PRESSED_TIME);
break;
}
return true;
为什么使用
event.getAction() & MotionEvent.ACTION_MASK哪?下面先来述说这个ACTION_MASK,解释如下:
ACTION_MASK在Android中是应用于多点触摸操作,字面上的意思大概是动作掩码的意思吧。
在onTouchEvent(MotionEvent event)中,使用switch (event.getAction())可以处理ACTION_DOWN和ACTION_UP事件;
使用switch (event.getAction() & MotionEvent.ACTION_MASK)就可以处理处理多点触摸的ACTION_POINTER_DOWN和ACTION_POINTER_UP事件。
ACTION_DOWN和ACTION_UP就是单点触摸屏幕,按下去和放开的操作;
ACTION_POINTER_DOWN和ACTION_POINTER_UP就是多点触摸屏幕,当有一只手指按下去的时候,另一只手指按下和放开的动作捕捉;
ACTION_MOVE就是手指在屏幕上移动的操作;
对,使用这个
MotionEvent.ACTION_MASK就是为了支持多点触控,这个地方我不太懂,所以在这里记录一下.
还有就是调用handler的postDelayed()方法,一共有两个参数,前一个是Runnable 接口,后一个是指定延迟的时间,也就是多长时间后执行Runnable中的方法.下面需要说的就是这个LongPressedToast,这个是我自己定义的一个内部类,代码如下:
private class LongPressedToast implements Runnable{
@Override
public void run() {
Toast.makeText(getApplicationContext(), "***", Toast.LENGTH_SHORT).show();
}
}
这个很简单,就是实现Runnable中的run方法,那么在你手指按下屏幕的时候,延时一段时间就会执行出现Toast的行为,这个延迟执行的时间需要由LongPressedTime来定义,当你按下后,延迟自定的时间后,会弹出这个Toast,所以这个就是我们需要的效果!
这个例子的应用在于可以控制按下后延迟多长时间执行,特此记录下!
代码实例下载:
http://download.csdn.net/detail/u010665691/8139415