好的,您的问题是“无法触发长按,总是需要触摸监听器”,但这还不够。我需要更多细节:
- 您应该使用哪个视图来处理长按、父视图或子视图?
- 你用哪个监听器来处理长按,android.view.View.setOnLongClickListener 或 android.view.GestureDetector?
实际上我上周做了同样的工作。我的经验是:不使用 android.view.View.setOnLongClickListener 也不使用 android.view.GestureDetector,自己处理对父视图的长按。View.java 就是一个很好的例子。
编辑:
我手头没有编译器,所以我只输入伪代码,它会自行处理长按,对于真实代码,View.java 会给你最好的答案。
首先,您需要一个 runnable 来实现您的操作
class CheckForLongPress implements Runnable {
public void run() {
if (getParent() != null) {
// show toast
}
}
}
其次,修改你的 onTouchEvent 以检测长按
boolean onTouchEvent(...) {
switch (event.getAction()) {
case MotionEvent.ACITON_DOWN:
// post a delayed runnable to detecting long press action.
// here mPendingCheckForLongPress is instance of CheckForLongPress
postDelayed(mPendingCheckForLongPress, ViewConfiguration.getLongPressTimeout());
...
break;
case MotionEvent.ACTION_MOVE:
// cancel long press action
if (distance(event, lastMotionEvent) > mTouchSlop) {
removeCallbacks(mPendingCheckForLongPress);
}
...
break;
case MotionEvent.ACTION_UP:
// cancel long press action
removeCallbacks(mPendingCheckForLongPress);
...
break;
再次编辑:
以下是真实代码,不是伪代码,非常简单,显示了如何在 View.onTouchEvent() 中处理长按,希望对您有所帮助。
public class ItemView extends View {
public ItemView(Context context) {
super(context);
}
public ItemView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public ItemView(Context context, AttributeSet attrs) {
super(context, attrs);
}
Runnable mLongPressDetector = new Runnable() {
public void run() {
Toast.makeText(getContext(), "Hello long press", Toast.LENGTH_SHORT).show();
}
};
MotionEvent mLastEvent;
@Override
public boolean onTouchEvent(MotionEvent event) {
mLastEvent = MotionEvent.obtain(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
postDelayed(mLongPressDetector, ViewConfiguration.getLongPressTimeout());
break;
case MotionEvent.ACTION_MOVE:
final int slop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
if (Math.abs(mLastEvent.getX() - event.getX()) > slop ||
Math.abs(mLastEvent.getY() - event.getY()) > slop) {
removeCallbacks(mLongPressDetector);
}
break;
case MotionEvent.ACTION_UP:
removeCallbacks(mLongPressDetector);
break;
}
return true;
}
}