Android自定义长按事件
2013-06-05 15:25
309 查看
比如当希望长按的时间更长一点的时候。这时候就需要自己来定义这个长按事件了。下面是去年我写代码的时候,自定义长按事件的方式:
代码里注释的比较清楚。主要思路是在down的时候,让一个Runnable一段时间后执行,如果时间到了,没有移动超过定义的阈值,也没有释放,则触发长按事件。在真实环境中,当长按触发之后,还需要将后来的move和up事件屏蔽掉。此处是示例,就略去了。
思路跟第一种差不多,不过,在移动超过阈值和释放之后,会将Runnable从事件队列中remove掉,长按事件也就不会再触发了。源码中实现长按的原理也基本如此。
工程见附件。
Funny.zip (53.6 KB)
下载次数: 646
http://chroya.iteye.com/blog/804706
Activity调用。
LongPressEventDemo.rar (14.4 KB)
下载次数: 7
/article/4002466.html
/article/1854728.html
http://www.open-open.com/lib/view/open1362710410109.html
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)
下载次数: 646
http://chroya.iteye.com/blog/804706
Activity调用。
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View mLongPressView = new LongPressView(this); mLongPressView.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { Toast.makeText(MainActivity.this, "I got a long press!", Toast.LENGTH_SHORT).show(); return false; } }); setContentView(mLongPressView); } }
LongPressEventDemo.rar (14.4 KB)
下载次数: 7
/article/4002466.html
/article/1854728.html
http://www.open-open.com/lib/view/open1362710410109.html
相关文章推荐
- android自定义view的长按事件的执行时间
- android 自定义button背景图片及事件——自定义控件学习(一)
- Android MenuItem 自定义长按事件的实现
- Android ---------高德卫星地图绘制多个点和点的点击事件自定义弹窗
- 来实现android自定义的menu菜单之二:为自定义menu中的线性布局添加事件
- 自定义android用户控件,使用回调函数实现自定义事件
- Android Static FrameWork(天眼SkyMonitoring), 埋点统计SDK: 支持Activity路由统计,自定义事件统计,Crash日志统计。
- Android自定义View滑动事件处理总结
- Android系统中自定义按键的短按、双击、长按事件
- Android自定义控件系列 十:利用添加自定义布局来搞定触摸事件的分发,解决组合界面中特定控件响应特定方向的事件
- Android 自定义view模板并实现点击事件的回调
- (Android学习之路)Android中listView结合自定义适配器,并实现item中button点击事件
- Android 自定义Dialog,自定义接口监听事件。
- Android_自定义View---三种事件的触发、自定义View属性
- android自定义view事件分发总结
- React Native API模块BackAndroid自定义返回键事件处理
- Android添加自定义广播事件(带多个参数)
- android自定义ViewPager之——处理与ScrollView的事件冲突
- android 自定义ListView实现下拉刷新、分页加载、点击事件——自定义控件学习(七)
- Android中自定义ScrollView的滑动监听事件