- 浏览: 656285 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
ZHOU452840622:
少了一个构造函数 晕
Android画图之Matrix(一) -
ZHOU452840622:
06-30 17:39:19.193: E/AndroidRu ...
Android画图之Matrix(一) -
ZHOU452840622:
为什么报错哦
Android画图之Matrix(一) -
悬空90:
只是获取activity的名字而已, 没有实例。 反射 ...
获取屏幕上正在显示的activity -
night_iv:
重写下面两个函数EditText完全作废,点击没有反应没有光标 ...
Android自由选择TextView的文字
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掉,长按事件也就不会再触发了。源码中实现长按的原理也基本如此。
工程见附件。
- Funny.zip (53.6 KB)
- 下载次数: 1032
评论
28 楼
Badwaka
2015-12-02
Badwaka 写道
大神你太厉害了!
这个思路很特别,直接控制longClick事件的分发
我之前一直想着自己来做判定,很麻烦很麻烦,想的脑子都爆炸了。。。
谢谢大神~~~~
27 楼
Badwaka
2015-12-02
大神你太厉害了!
26 楼
lanroness
2014-05-21
lanroness 写道
打开是黑屏啊
就在屏幕上按么?为什么不弄个按钮呢
25 楼
lanroness
2014-05-21
打开是黑屏啊
24 楼
zhaoyazhong
2013-10-31
最近在做MapView相关的东西,长按,移动,点击相互影响,文章太有用了。桑扣!
23 楼
chroya
2012-09-24
sayyanfu 写道
chroya 写道
热血pk007 写道
chroya 写道
热血pk007 写道
这个运行之后怎么是黑屏?触屏没反应啊
你看代码啊,log里面会打出来的。
长按时间也没有加长啊,和内部自带的长按事件是相同的时间长短啊
是的,长按事件是用的系统的时间ViewConfiguration.getLongPressTimeout(),如果你需要加长,可以自己更改,把这个改成想要的时间。
ViewConfiguration.getLongPressTimeout()是个常量如何修改?
sayyanfu 写道
chroya 写道
热血pk007 写道
chroya 写道
热血pk007 写道
这个运行之后怎么是黑屏?触屏没反应啊
你看代码啊,log里面会打出来的。
长按时间也没有加长啊,和内部自带的长按事件是相同的时间长短啊
是的,长按事件是用的系统的时间ViewConfiguration.getLongPressTimeout(),如果你需要加长,可以自己更改,把这个改成想要的时间。
ViewConfiguration.getLongPressTimeout()是个常量如何修改?
我不是说改ViewConfiguration.getLongPressTimeout()它的值,而是说自己定义长按delay的时间
22 楼
sayyanfu
2012-09-10
chroya 写道
热血pk007 写道
chroya 写道
热血pk007 写道
这个运行之后怎么是黑屏?触屏没反应啊
你看代码啊,log里面会打出来的。
长按时间也没有加长啊,和内部自带的长按事件是相同的时间长短啊
是的,长按事件是用的系统的时间ViewConfiguration.getLongPressTimeout(),如果你需要加长,可以自己更改,把这个改成想要的时间。
ViewConfiguration.getLongPressTimeout()是个常量如何修改?
21 楼
chroya
2012-07-11
ysxmwyhh 写道
请问我怎么在自己的button上面使用这个长按事件
自己的Button实现文中所述的几个方法,然后直接setOnLongClickListener即可。
20 楼
ysxmwyhh
2012-07-04
请问我怎么在自己的button上面使用这个长按事件
19 楼
chroya
2011-12-31
Dr.hydra 写道
感谢楼主!非常感谢,最近在做一个东西,正好遇到一个长按滑动和普通滑动并存的问题,幸亏看到楼主的文章!楼主能留个联系方式不,以后想向您请教
加群:5838954
18 楼
Dr.hydra
2011-12-07
感谢楼主!非常感谢,最近在做一个东西,正好遇到一个长按滑动和普通滑动并存的问题,幸亏看到楼主的文章!楼主能留个联系方式不,以后想向您请教
17 楼
u_xtian
2011-10-13
很不错!但是我现在需要自定义AdapterView里面的OnItemLongClickListener,难搞啊
16 楼
王山而
2011-08-08
mark
15 楼
greenboy1
2011-05-16
楼主的文章不错
14 楼
chroya
2011-02-22
binggo2011 写道
chroya 写道
binggo2011 写道
在onTOuch里面监听action-move执行的次数也可以实现longclick,
不知道有没意义,性能怎么样?
不知道有没意义,性能怎么样?
不明白,监听action-move执行次数有什么作用?多少次算是longclick?
/**
* 自定义图片左右手势和类LongClick触发事件
* @author Administrator
*
*/
public abstract class MyOnTouchListener implements OnTouchListener {
private static final int MOVE_MIN_DISTANCE = 100; //触发左移或右移的最小距离
private static final int LONG_CLICK_MIN_DISTANCE = 20; //触发LongClick的最大移动距离
private static final int LONG_CLICK_MIN_TIME = 35; //触发LongClick的最小ACTION_MOVE的次数
private float mX;
private int mNum = 0;
public abstract void setLeftEvent();
public abstract void setRightEvent();
public abstract void setLongClickEvent();
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mX = event.getX();
return false;
case MotionEvent.ACTION_CANCEL:
return false;
case MotionEvent.ACTION_MOVE:
System.out.println("MOVE");
mNum++;
return false;
case MotionEvent.ACTION_OUTSIDE:
return false;
case MotionEvent.ACTION_UP:
float distance = event.getX() - mX;
if (Math.abs(distance) > MOVE_MIN_DISTANCE) {
if (distance > 0)
setRightEvent();
else
setLeftEvent();
} else if (Math.abs(distance) < LONG_CLICK_MIN_DISTANCE
&& mNum > LONG_CLICK_MIN_TIME) {
setLongClickEvent();
}
mNum = 0;
return true;
}
return false;
}
}
我哥介绍看你的博客的 说看了能变超人的... 呃.
根据次数判断长按,太不严谨了
别被误导了
13 楼
binggo2011
2011-02-22
chroya 写道
binggo2011 写道
在onTOuch里面监听action-move执行的次数也可以实现longclick,
不知道有没意义,性能怎么样?
不知道有没意义,性能怎么样?
不明白,监听action-move执行次数有什么作用?多少次算是longclick?
/**
* 自定义图片左右手势和类LongClick触发事件
* @author Administrator
*
*/
public abstract class MyOnTouchListener implements OnTouchListener {
private static final int MOVE_MIN_DISTANCE = 100; //触发左移或右移的最小距离
private static final int LONG_CLICK_MIN_DISTANCE = 20; //触发LongClick的最大移动距离
private static final int LONG_CLICK_MIN_TIME = 35; //触发LongClick的最小ACTION_MOVE的次数
private float mX;
private int mNum = 0;
public abstract void setLeftEvent();
public abstract void setRightEvent();
public abstract void setLongClickEvent();
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mX = event.getX();
return false;
case MotionEvent.ACTION_CANCEL:
return false;
case MotionEvent.ACTION_MOVE:
System.out.println("MOVE");
mNum++;
return false;
case MotionEvent.ACTION_OUTSIDE:
return false;
case MotionEvent.ACTION_UP:
float distance = event.getX() - mX;
if (Math.abs(distance) > MOVE_MIN_DISTANCE) {
if (distance > 0)
setRightEvent();
else
setLeftEvent();
} else if (Math.abs(distance) < LONG_CLICK_MIN_DISTANCE
&& mNum > LONG_CLICK_MIN_TIME) {
setLongClickEvent();
}
mNum = 0;
return true;
}
return false;
}
}
我哥介绍看你的博客的 说看了能变超人的... 呃.
12 楼
chroya
2011-02-21
binggo2011 写道
在onTOuch里面监听action-move执行的次数也可以实现longclick,
不知道有没意义,性能怎么样?
不知道有没意义,性能怎么样?
不明白,监听action-move执行次数有什么作用?多少次算是longclick?
11 楼
binggo2011
2011-02-21
在onTOuch里面监听action-move执行的次数也可以实现longclick,
不知道有没意义,性能怎么样?
不知道有没意义,性能怎么样?
10 楼
alen456
2010-12-06
长按键,我之前也做过了,但是感觉你的代码比我的少点,感谢你!
9 楼
chroya
2010-12-05
热血pk007 写道
chroya 写道
热血pk007 写道
这个运行之后怎么是黑屏?触屏没反应啊
你看代码啊,log里面会打出来的。
长按时间也没有加长啊,和内部自带的长按事件是相同的时间长短啊
是的,长按事件是用的系统的时间ViewConfiguration.getLongPressTimeout(),如果你需要加长,可以自己更改,把这个改成想要的时间。
发表评论
-
Android NFC内部机制分析
2012-08-06 19:48 3一、初始 一般需要使用nfc ... -
Android NFC简介
2012-08-03 11:31 4280目录: Android NFC ... -
Android放大镜的实现
2011-02-24 20:29 14231快三个月了没写博客了,因为工作调动,很多经验、心得都没 ... -
Android简单的圆盘形菜单
2010-12-01 17:10 15387今天偶然看到一个圆盘形的菜单,还可以转动,感觉挺 ... -
Android的3D旋转
2010-11-29 12:27 23096见过没有用opengl的3D动画,看了一下,是 ... -
让自己的Android应用支持appwidget
2010-11-26 13:25 7757经常看到一些教程教你如何写appwidget, ... -
ConditionVariable的用法
2010-11-07 21:35 8655线程操作经常用到wait和notify,用起来稍显 ... -
Android获取应用程序的大小
2010-10-22 23:53 11193今天碰到个问 ... -
Android获取其他包的Context实例然后干坏事
2010-09-12 14:55 25062Android中有Context ... -
android监听文件和目录的创建删除移动等事件
2010-09-11 21:18 13617android.os下的FileObserver类 ... -
解决android自定义标题栏充满的问题
2010-09-10 15:27 10751一个接着一个的activity,写啊写,调啊调 ... -
Android中用AsyncTask简单实现多线程
2010-09-07 14:11 5170一般情况下在an ... -
Android自由选择TextView的文字
2010-09-02 15:47 19232用过EditText的都 ... -
NDK入门、提高和实战
2010-08-04 18:25 3252网上也有一些对NDK ... -
linux下用adb连接手机的问题解决
2010-08-02 16:17 5977在linux里面,模拟器可以直接识别,使用adb也 ... -
Android系统事件的recycle原理
2010-07-22 19:07 6211最近封装一些功能 ... -
Android画图之Matrix(二)
2010-07-15 22:01 33947上一篇Android画图之Matrix(一) 讲 ... -
Android画图之Matrix(一)
2010-07-13 22:54 32804Matrix ,中文里叫矩阵, ... -
Android画图之Bitmap(二)
2010-07-11 22:21 10764前面一篇博文Android画图之Bitma ... -
Android画图之Bitmap(一)
2010-07-11 19:51 15620最近写电子书 ...
相关推荐
博客地址http://blog.csdn.net/u010665691/article/details/40954983 对应着博客的实例代码
Android自定义TextView链接点击和长按事件
自定义WebView页面中,长按文本的弹出选项、点击选择后,分享、转发、收藏选择文本
NULL 博文链接:https://elingwange.iteye.com/blog/1666741
主要介绍了Android MenuItem 自定义长按事件的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了Android WebView自定义长按选择实现收藏/分享选中文本功能,需要的朋友可以参考下
Android自定义按钮,实现长按处理的功能 详情见http://blog.csdn.net/huahuadashen/article/details/17711551
本文主要介绍Android 中监听按键的长按事件,对按键机制进行详解,并附有代码实例,具有参考价值,希望能帮到有需要的小伙伴
android自定义GridView长按拖动排序,类似支付宝首页,震动提示,固定最后一个“更多”item。退出应用程序后,保存修改的item位置到数据库,实现记住修改位置。
Android 自定义按钮点击事件和长按事件对比 一个按钮同时实现点击和长按事件,有时候会有冲突,我们针对这一现象来自定义按钮来区分点击和长按事件 1.xml中 <LinearLayout xmlns:android=...
在做项目中碰见一个在listview子项里面长按,会显示不定数量的控件出来,于是我通过添加自定义view来实现,当然也可以通过listview动态添加gridview来实现.功能说明,长按显示新添加上去的自定义view,点击中间的...
Android ContextMenu实例,为EditText文本框添加上下文菜单,菜单激活并显示的方式是,用户在EditText输入框上面长按2秒,即可弹出上下文菜单,如运行截图所示的效果,为实现此功能,创建了onCreateContextMenu ...
Android中的View.OnLongClickListener不支持长按操作的自定义持续时间。 使用该库可以根据需要调用具有自定义持续时间的长按(click)操作。 LongPressListener具有自定义持续时间的Android长按(单击)侦听器...
长按 imageVIew 产生一个 和imageview 长的差不多的 图片 半透明 并可以随着手指移动
关于ExpandableListView长按事件处理,网上很多都是使用将上下文菜单注册到ExpandableListView上实现长按事件。这样做弊端显而易见,不够灵活,不能分别对父项、子项、父项之间、子项之间弹出内容做区分。下面来说我...
Android自定义控件——圆形进度条 代码中有非常详细的注释,如果有问题可以到http://blog.csdn.net/a253664942/article/details/45115407上留言
Camera2 api实现点击拍照,长按录制