Java Android长触摸事件
我有两个按钮,每按一次就增加和减少一个值,它们在onclick侦听器中工作得很好。我看到存在一个onLongClickListener,我假设它用于触摸屏事件。如果按住按钮,我将如何使数字快速递增/递减Java Android长触摸事件,java,android,listener,Java,Android,Listener,我有两个按钮,每按一次就增加和减少一个值,它们在onclick侦听器中工作得很好。我看到存在一个onLongClickListener,我假设它用于触摸屏事件。如果按住按钮,我将如何使数字快速递增/递减 假设onLongClickListener每次长时间单击仅触发一次,我的假设正确吗?是否有我不知道的更合适的侦听器或属性?您可以在下面的代码中实现它 package org.me.rapidchange; import android.app.Activity; import android.
假设onLongClickListener每次长时间单击仅触发一次,我的假设正确吗?是否有我不知道的更合适的侦听器或属性?您可以在下面的代码中实现它
package org.me.rapidchange;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.TextView;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class MainActivity extends Activity implements OnKeyListener,
OnTouchListener, OnClickListener {
private class UpdateCounterTask implements Runnable {
private boolean mInc;
public UpdateCounterTask(boolean inc) {
mInc = inc;
}
public void run() {
if (mInc) {
mHandler.sendEmptyMessage(MSG_INC);
} else {
mHandler.sendEmptyMessage(MSG_DEC);
}
}
}
private static final int MSG_INC = 0;
private static final int MSG_DEC = 1;
private Button mIncButton;
private Button mDecButton;
private TextView mText;
private int mCounter;
private Handler mHandler;
private ScheduledExecutorService mUpdater;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_INC:
inc();
return;
case MSG_DEC:
dec();
return;
}
super.handleMessage(msg);
}
};
mIncButton = (Button) findViewById(R.id.inc_button);
mDecButton = (Button) findViewById(R.id.dec_button);
mText = (TextView) findViewById(R.id.text);
mIncButton.setOnTouchListener(this);
mIncButton.setOnKeyListener(this);
mIncButton.setOnClickListener(this);
mDecButton.setOnTouchListener(this);
mDecButton.setOnKeyListener(this);
mDecButton.setOnClickListener(this);
}
private void inc() {
mCounter++;
mText.setText(Integer.toString(mCounter));
}
private void dec() {
mCounter--;
mText.setText(Integer.toString(mCounter));
}
private void startUpdating(boolean inc) {
if (mUpdater != null) {
Log.e(getClass().getSimpleName(), "Another executor is still active");
return;
}
mUpdater = Executors.newSingleThreadScheduledExecutor();
mUpdater.scheduleAtFixedRate(new UpdateCounterTask(inc), 200, 200,
TimeUnit.MILLISECONDS);
}
private void stopUpdating() {
mUpdater.shutdownNow();
mUpdater = null;
}
public void onClick(View v) {
if (mUpdater == null) {
if (v == mIncButton) {
inc();
} else {
dec();
}
}
}
public boolean onKey(View v, int keyCode, KeyEvent event) {
boolean isKeyOfInterest = keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER;
boolean isReleased = event.getAction() == KeyEvent.ACTION_UP;
boolean isPressed = event.getAction() == KeyEvent.ACTION_DOWN
&& event.getAction() != KeyEvent.ACTION_MULTIPLE;
if (isKeyOfInterest && isReleased) {
stopUpdating();
} else if (isKeyOfInterest && isPressed) {
startUpdating(v == mIncButton);
}
return false;
}
public boolean onTouch(View v, MotionEvent event) {
boolean isReleased = event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL;
boolean isPressed = event.getAction() == MotionEvent.ACTION_DOWN;
if (isReleased) {
stopUpdating();
} else if (isPressed) {
startUpdating(v == mIncButton);
}
return false;
}
}
您可以在下面的代码中实现它
package org.me.rapidchange;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.TextView;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class MainActivity extends Activity implements OnKeyListener,
OnTouchListener, OnClickListener {
private class UpdateCounterTask implements Runnable {
private boolean mInc;
public UpdateCounterTask(boolean inc) {
mInc = inc;
}
public void run() {
if (mInc) {
mHandler.sendEmptyMessage(MSG_INC);
} else {
mHandler.sendEmptyMessage(MSG_DEC);
}
}
}
private static final int MSG_INC = 0;
private static final int MSG_DEC = 1;
private Button mIncButton;
private Button mDecButton;
private TextView mText;
private int mCounter;
private Handler mHandler;
private ScheduledExecutorService mUpdater;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_INC:
inc();
return;
case MSG_DEC:
dec();
return;
}
super.handleMessage(msg);
}
};
mIncButton = (Button) findViewById(R.id.inc_button);
mDecButton = (Button) findViewById(R.id.dec_button);
mText = (TextView) findViewById(R.id.text);
mIncButton.setOnTouchListener(this);
mIncButton.setOnKeyListener(this);
mIncButton.setOnClickListener(this);
mDecButton.setOnTouchListener(this);
mDecButton.setOnKeyListener(this);
mDecButton.setOnClickListener(this);
}
private void inc() {
mCounter++;
mText.setText(Integer.toString(mCounter));
}
private void dec() {
mCounter--;
mText.setText(Integer.toString(mCounter));
}
private void startUpdating(boolean inc) {
if (mUpdater != null) {
Log.e(getClass().getSimpleName(), "Another executor is still active");
return;
}
mUpdater = Executors.newSingleThreadScheduledExecutor();
mUpdater.scheduleAtFixedRate(new UpdateCounterTask(inc), 200, 200,
TimeUnit.MILLISECONDS);
}
private void stopUpdating() {
mUpdater.shutdownNow();
mUpdater = null;
}
public void onClick(View v) {
if (mUpdater == null) {
if (v == mIncButton) {
inc();
} else {
dec();
}
}
}
public boolean onKey(View v, int keyCode, KeyEvent event) {
boolean isKeyOfInterest = keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER;
boolean isReleased = event.getAction() == KeyEvent.ACTION_UP;
boolean isPressed = event.getAction() == KeyEvent.ACTION_DOWN
&& event.getAction() != KeyEvent.ACTION_MULTIPLE;
if (isKeyOfInterest && isReleased) {
stopUpdating();
} else if (isKeyOfInterest && isPressed) {
startUpdating(v == mIncButton);
}
return false;
}
public boolean onTouch(View v, MotionEvent event) {
boolean isReleased = event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL;
boolean isPressed = event.getAction() == MotionEvent.ACTION_DOWN;
if (isReleased) {
stopUpdating();
} else if (isPressed) {
startUpdating(v == mIncButton);
}
return false;
}
}
我也有同样的目标,最后使用OnLongClick捕捉向下部分,通过处理程序启动重复事件,然后使用普通OnClick捕捉发布并停止它。对我来说效果很好
mOngoingRunnable = new Runnable() {
public void run() {
// do stuff
mHandler.postDelayed(mOngoingRunnable, delayMsecs);
}
};
public boolean onLongClick(View view) {
mHandler.post(mOngoingRunnable);
mOngoing = true;
return false;
}
public void onClick(View view) {
if (mOngoing) {
mHandler.removeCallbacks(mOngoingRunnable);
mOngoing = false;
}
}
我也有同样的目标,最后使用OnLongClick捕捉向下部分,通过处理程序启动重复事件,然后使用普通OnClick捕捉发布并停止它。对我来说效果很好
mOngoingRunnable = new Runnable() {
public void run() {
// do stuff
mHandler.postDelayed(mOngoingRunnable, delayMsecs);
}
};
public boolean onLongClick(View view) {
mHandler.post(mOngoingRunnable);
mOngoing = true;
return false;
}
public void onClick(View view) {
if (mOngoing) {
mHandler.removeCallbacks(mOngoingRunnable);
mOngoing = false;
}
}
这真是太棒了,我想我甚至理解它是如何工作的,哈哈。谢谢!这真是太棒了,我想我甚至理解它是如何工作的,哈哈。谢谢!尝试在ontouch中使用,它会为您提供一个motionevent。你可以检查动作下降和动作上升。基本上,您是在触摸屏上实现的,而在按住按钮时,我只需要一个x和一个TextView.setText(每隔200ms左右)。很抱歉,我对Java没有太多经验,我的大部分经验都是ASP/PHP类型的东西,没有太多的交互性。如果有人可能有示例代码,或者可以为我指出正确的方法,我将不胜感激,我甚至不知道从何处开始。使用Handler.sendDelayedMessage()每隔x毫秒向自己发布一条消息,直到您获得up事件。尝试在ontouch中使用,它将为您提供一个motionevent。你可以检查动作下降和动作上升。基本上,您是在触摸屏上实现的,而在按住按钮时,我只需要一个x和一个TextView.setText(每隔200ms左右)。很抱歉,我对Java没有太多经验,我的大部分经验都是ASP/PHP类型的东西,没有太多的交互性。如果有人可能有示例代码,或者可以为我指出正确的方法,我将不胜感激,我甚至不知道从何处开始使用此方法。使用Handler.sendDelayedMessage()每隔x毫秒向自己发布一条消息,直到获得up事件。