我想要两个单独的事件,长按向下和长按。我该如何在Android中执行此操作?
我尝试的内容如下
public class FfwRewButton extends ImageButton {
public interface ButtonListener {
void OnLongClickDown(View v);
void OnLongClickUp(View v);
}
private ButtonListener mListener;
private boolean mLongClicked = false;
public FfwRewButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setFocusable(true);
setLongClickable(true);
}
public FfwRewButton(Context context) {
this(context, null);
}
public FfwRewButton(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.imageButtonStyle);
}
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
Log.d("my listener", "long press");
mLongClicked = true;
mListener.OnLongClickDown(this);
return super.onKeyLongPress(keyCode, event);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.d("my listener", "key down");
mLongClicked = false;
if (true) {
super.onKeyDown(keyCode, event);
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
Log.d("my listener", "key up");
if (mLongClicked)
mListener.OnLongClickUp(this);
return super.onKeyUp(keyCode, event);
}
public void setFfwRewButtonListener(ButtonListener listener) {
mListener = listener;
}
}
在一项活动中,我称之为
private FfwRewButton.ButtonListener mListener = new FfwRewButton.ButtonListener() {
@Override
public void OnLongClickUp(View v) {
Log.d(TAG, "longClickup");
}
@Override
public void OnLongClickDown(View v) {
Log.d(TAG, "longClickdown");
}
};
但仍然没有在logcat中获取任何Log消息 谁能帮我;哪里错了?
答案 0 :(得分:6)
onKeyXXX()
方法适用于来自键盘或硬键的键事件,例如菜单键,搜索键等。
如果您要检测Android中的MotionEvent
触摸事件,则必须覆盖onTouchEvent(MotionEvent e)
方法并使用GestureDetector
类来识别长按。
private GestureDetector mGestureDetector;
public FfwRewButton(...) {
//....
mGestureDetector = new GestureDetector(context,
new GestureDetector.SimpleOnGestureListener() {
public boolean onDown(MotionEvent e) {
mLongClicked = false;
return true;
}
public void onLongPress(MotionEvent e) {
mLongClicked = true;
// long press down detected
}
});
}
public boolean onTouchEvent(MotionEvent e) {
mGestureDetector.onTouchEvent(e);
if (mLongClicked && e.getAction() == ACTION_UP) {
// long press up detected
}
}
}
答案 1 :(得分:3)
这样的事情会让你走上正确的道路,
我没有编译,所以你可能需要纠正一些语法,但你的目标可以用这个概念来实现
OnTouchListener mTouchListener = new OnTouchListener(){
private totalTimeDown = -1;
private downTime = -1;
public boolean onTouch(View v, MotionEvent me){
if(me.getAction() == MotionEvent.ACTION_DOWN){
downTime = System.getCurrentTimeInMillis();
return true;
}
if(me.getAction() == MotionEvent.ACTION_UP){
totalTimeDown = System.getCurrentTimeInMillis() - downTime;
if(totalTimeDown > 500){
//Finger was down long enough for "longClick"
return true;
}
}
return false;
}
});
答案 2 :(得分:0)
holder.layout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
holder.layoutItem.setVisibility(View.GONE);
holder.layoutDelete.setVisibility(View.VISIBLE);
}
}, 1000);
// PRESSED
return true; // if you want to handle the touch event
case MotionEvent.ACTION_UP:
holder.layoutItem.setVisibility(View.VISIBLE);
holder.layoutDelete.setVisibility(View.GONE);
// RELEASED
return true; // if you want to handle the touch event
}
return false;
}
});