如何在按下按钮时继续添加?
How to keep adding while button is pressed?
我正在构建一个简单的计数器,它有用于从总值中添加或减去的按钮,我希望它在我按住按钮时继续添加,每秒递增 +5,但我遇到了问题让它起作用。我正在使用 onClickListener,但我无法找到使其与触摸侦听器一起工作的方法"together"。
pl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
lf++;
lt.setText(Integer.toString(lf));
}
}
您将不得不使用处理程序来安排每 1 秒递增 +5 的可运行对象(每 200 毫秒递增 1 以保持平稳)
Handler handler = new Handler();
Runnable incrementTask = new Runnable(){
@Override
public void run(){
lf++;
handler.postDelayed(incrementTask, 200); //Execute after 200 milliseconds
}
};
然后在调度 ACTION_DOWN 时实现 onTouchListener 和 post 这个可运行对象,并在调度 ACTION_UP 时取消它。
boolean buttonPressed = false;
pl.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
//This check is imporant since ACTION_DOWN might be called
// multiple times when finger is moving
if(!buttonPressed){
buttonPressed = true;
handler.post(incrementTask);
}
} else if(event.getAction() == MotionEvent.ACTION_UP){
if(buttonPressed)
{
buttonPressed = false;
handler.cancel(incrementTask);
}
}
return false;
}
});
请注意,此逻辑不适用于您当前的点击侦听器。为了更好的用户体验,我建议您仅在 长按 按钮时才启动此 timer/runnable。我在一个项目中遇到过类似的情况,所以我写了一个实用程序 class 来帮助我检测何时按住按钮并在长按后释放按钮。正常点击也能正常工作。你可以找到我的 ClickAndHoldManager class on Github.
要使用它,您只需在构造函数中传递您的视图并设置一个侦听器:
ClickAndHoldManager manager = new ClickAndHoldManager(myButton);
manager.setClickCallback(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Regular Click
}
});
manager.setHoldCallback(new ClickAndHoldManager.HoldListener() {
@Override
public void holdStarted() {
// do handler.post() here
}
@Override
public void holdEnded() {
//do handler.cancel() here
}
});
我正在构建一个简单的计数器,它有用于从总值中添加或减去的按钮,我希望它在我按住按钮时继续添加,每秒递增 +5,但我遇到了问题让它起作用。我正在使用 onClickListener,但我无法找到使其与触摸侦听器一起工作的方法"together"。
pl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
lf++;
lt.setText(Integer.toString(lf));
}
}
您将不得不使用处理程序来安排每 1 秒递增 +5 的可运行对象(每 200 毫秒递增 1 以保持平稳)
Handler handler = new Handler();
Runnable incrementTask = new Runnable(){
@Override
public void run(){
lf++;
handler.postDelayed(incrementTask, 200); //Execute after 200 milliseconds
}
};
然后在调度 ACTION_DOWN 时实现 onTouchListener 和 post 这个可运行对象,并在调度 ACTION_UP 时取消它。
boolean buttonPressed = false;
pl.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
//This check is imporant since ACTION_DOWN might be called
// multiple times when finger is moving
if(!buttonPressed){
buttonPressed = true;
handler.post(incrementTask);
}
} else if(event.getAction() == MotionEvent.ACTION_UP){
if(buttonPressed)
{
buttonPressed = false;
handler.cancel(incrementTask);
}
}
return false;
}
});
请注意,此逻辑不适用于您当前的点击侦听器。为了更好的用户体验,我建议您仅在 长按 按钮时才启动此 timer/runnable。我在一个项目中遇到过类似的情况,所以我写了一个实用程序 class 来帮助我检测何时按住按钮并在长按后释放按钮。正常点击也能正常工作。你可以找到我的 ClickAndHoldManager class on Github.
要使用它,您只需在构造函数中传递您的视图并设置一个侦听器:
ClickAndHoldManager manager = new ClickAndHoldManager(myButton);
manager.setClickCallback(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Regular Click
}
});
manager.setHoldCallback(new ClickAndHoldManager.HoldListener() {
@Override
public void holdStarted() {
// do handler.post() here
}
@Override
public void holdEnded() {
//do handler.cancel() here
}
});