Android系统自带了长按事件,setOnLongClickListener即可监听。但是有时候,你不希望用系统的长按事件,比如当希望长按的时间更长一点的时候。这时候就需要自己来定义这个长按事件了。
下面是去年我写代码的时候,自定义长按事件的方式:
package chroya.fun;
import android.content.Context;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
public class LongPressView1 extends View{
private int mLastMotionX, mLastMotionY;
//是否移动了
private boolean isMoved;
//是否释放了
private boolean isReleased;
//计数器,防止多次点击导致最后一次形成longpress的时间变短
private int mCounter;
//长按的runnable
private Runnable mLongPressRunnable;
//移动的阈值
private static final int TOUCH_SLOP = 20;
public LongPressView1(Context context) {
super(context);
mLongPressRunnable = new Runnable() {
@Override
public void run() {
mCounter--;
//计数器大于0,说明当前执行的Runnable不是最后一次down产生的。
if(mCounter>0 || isReleased || isMoved) return;
performLongClick();
}
};
}
public boolean dispatchTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
mLastMotionX = x;
mLastMotionY = y;
mCounter++;
isReleased = false;
isMoved = false;
postDelayed(mLongPressRunnable, ViewConfiguration.getLongPressTimeout());
break;
case MotionEvent.ACTION_MOVE:
if(isMoved) break;
if(Math.abs(mLastMotionX-x) > TOUCH_SLOP
|| Math.abs(mLastMotionY-y) > TOUCH_SLOP) {
//移动超过阈值,则表示移动了
isMoved = true;
}
break;
case MotionEvent.ACTION_UP:
//释放了
isReleased = true;
break;
}
return true;
}
}
代码里注释的比较清楚。主要思路是在down的时候,让一个Runnable一段时间后执行,如果时间到了,没有移动超过定义的阈值,也没有释放,则触发长按事件。在真实环境中,当长按触发之后,还需要将后来的move和up事件屏蔽掉。此处是示例,就略去了。
下面讲讲第二种方式:
package chroya.fun;
import android.content.Context;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
public class LongPressView2 extends View{
private int mLastMotionX, mLastMotionY;
//是否移动了
private boolean isMoved;
//长按的runnable
private Runnable mLongPressRunnable;
//移动的阈值
private static final int TOUCH_SLOP = 20;
public LongPressView2(Context context) {
super(context);
mLongPressRunnable = new Runnable() {
@Override
public void run() {
performLongClick();
}
};
}
public boolean dispatchTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
mLastMotionX = x;
mLastMotionY = y;
isMoved = false;
postDelayed(mLongPressRunnable, ViewConfiguration.getLongPressTimeout());
break;
case MotionEvent.ACTION_MOVE:
if(isMoved) break;
if(Math.abs(mLastMotionX-x) > TOUCH_SLOP
|| Math.abs(mLastMotionY-y) > TOUCH_SLOP) {
//移动超过阈值,则表示移动了
isMoved = true;
removeCallbacks(mLongPressRunnable);
}
break;
case MotionEvent.ACTION_UP:
//释放了
removeCallbacks(mLongPressRunnable);
break;
}
return true;
}
}
思路跟第一种差不多,不过,在移动超过阈值和释放之后,会将Runnable从事件队列中remove掉,长按事件也就不会再触发了。源码中实现长按的原理也基本如此。
工程见附件。
分享到:
相关推荐
在Android开发中,自定义长按事件是一项基本且重要的技能,尤其在设计交互式用户界面时。本知识点主要探讨如何在Android应用中实现自定义的长按事件,并结合实际的项目代码进行解析。 首先,我们需要了解Android中...
总结来说,自定义长按事件在Android开发中是常见的需求,通过`GestureDetector`可以方便地实现这一功能。在实际应用中,我们还可以结合其他手势,如滑动、双击等,为用户提供更为丰富的交互体验。对于`...
// 自定义长按事件的逻辑 return true; } }); ``` 四、自定义链接样式 除了点击和长按事件,我们还可以自定义链接的样式,例如颜色、下划线等。这可以通过设置`SpannableString`实现: ```java String text = ...
通过这种方式,我们就成功地实现了Android自定义按钮的长按功能。这种方法允许我们在不改变原有按钮样式的情况下,轻松添加长按行为,为用户提供更多的交互可能性。同时,自定义按钮类也可以根据需求扩展其他功能,...
总之,实现WebView自定义长按选择并提供收藏和分享选中文本的功能,涉及到WebView的事件监听、JavaScript与Java的交互、自定义菜单的创建以及Android的分享和存储机制。这需要开发者具备扎实的Android基础和一定的...
在Android开发中,用户交互是应用的核心部分,而长按事件(Long Press Event)是其中一种常见的交互方式。本文将详细讲解如何在Android应用中实现长按屏幕事件,并通过一个名为"LongPressEventDemo"的示例项目进行...
本篇文章将详细讲解如何在Android中实现MenuItem的自定义长按事件。 首先,实现MenuItem的长按事件主要涉及以下步骤: 1. **获取MenuItem的View**: 在Android中,MenuItem本身并不直接对应一个View,但它可以...
在`ExpandableListViewDemo`项目中,开发者通常会创建一个自定义的`ExpandableListAdapter`,在这个适配器中实现上述的点击和长按事件处理逻辑。同时,还需要在主活动中设置`ExpandableListView`并绑定适配器。 ...
综上所述,通过自定义Adapter、设置监听器以及使用接口回调,我们可以在RecyclerView中实现点击和长按事件。这个过程不仅涉及到事件监听,还涉及到组件交互和业务逻辑处理,是Android开发中的常见实践。
在Android开发中,处理文本链接的交互是一个常见的需求。...本文将深入探讨如何在Android中解决这种冲突,实现长按事件和短按事件...这种方法既保留了链接的默认外观,又允许我们自定义长按事件,从而提供更好的用户体验。
对于长按事件,我们需要使用`OnLongClickListener`。同样在`getView`中设置: ```java view.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { int ...
综上所述,实现Android ListView的长按删除功能,主要涉及以下几个步骤:设置适配器、添加长按监听器、处理长按事件、删除数据源中的项并更新适配器,以及可选地提供删除确认提示。通过这些步骤,你可以为你的...
首先,我们需要监听用户的长按事件。这通常通过在ImageView或自定义视图上添加OnLongClickListener来完成。当用户长按时,我们可以调用一个方法来处理图片的保存操作。以下是一个简单的例子: ```java imageView....
尤其对于需要频繁操作物理按键的场景,如相机应用、播放器控制等,对按键长按事件的监听尤其关键。长按事件不仅可以提高用户体验,还能使应用具备更多的交互操作。 首先,要理解Android按键事件的处理流程。在...
Android 自定义按钮点击事件和长按事件对比 Android 自定义按钮点击事件和长按事件对比是 Android 应用开发中经常遇到的问题。在 Android 中,我们可以通过设置OnClickListener 和 OnLongClickListener 来实现按钮...
以上就是实现Android自定义`GridView`长按拖动排序的详细步骤和技术要点。实际开发中,可能需要根据具体需求进行调整和优化,但这个基本框架应该足以指导你完成大部分工作。在`DragGridView`源代码中,你应该能找到...
在做项目中碰见一个在listview子项里面长按,会显示不定数量的控件出来,于是我通过添加自定义view来实现,当然也可以通过listview动态添加gridview来实现.功能说明,长按显示新添加上去的自定义view,点击中间的...