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
;
}
}