【问题标题】:Change a value smoothly increasing in speed by holding down a button通过按住按钮以平滑增加速度来更改值
【发布时间】:2011-11-23 08:37:07
【问题描述】:

这几天我一直在纠结这个问题。我尝试在 int-limits 范围内为大量数字提供选择器。您应该按住一个按钮,该值应该会缓慢变化,并且您按下的时间越长,它的变化就越快。你们都知道那种按钮,不是吗?! :D 输入数字必须准确且快速。我使用OnTouchListener。该事件允许.getDownTime()

我尝试了很多,但总是让它跳过数字(不是真的但太快无法使用)或者在按住按钮时不重复增加值。如果在没有更改的情况下运行,它会非常快,但如果它开始进行 10 100 或 1000 次跳跃(如果它被按住足够长的时间),那就太好了。

我准备了一个小 SSCCE,看起来像这样:

public class ValueChangerSSCCE extends Activity implements OnTouchListener {

Button plusButton;
TextView valueView;
Button minusButton;
int value;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);

    plusButton = new Button(this);
    plusButton.setText("+");
    plusButton.setTextSize(120f);
    plusButton.setOnTouchListener(this);
    layout.addView(plusButton);

    valueView = new TextView(this);
    valueView.setGravity(Gravity.CENTER_HORIZONTAL);
    valueView.setTextColor(Color.WHITE);
    valueView.setText(value + "");
    valueView.setTextSize(120f);
    layout.addView(valueView);

    minusButton = new Button(this);
    minusButton.setText("-");
    minusButton.setTextSize(120f);
    minusButton.setOnTouchListener(this);
    layout.addView(minusButton);

    setContentView(layout);
}

/* 
 * Called when a button is pressed
 */
@Override
public boolean onTouch(View v, MotionEvent event) {

    if (v == plusButton) {
        value++;
    } else if (v == minusButton) {
        value--;
    }
    valueView.setText(value + "");

    return false;
}
}

对于分辨率较低的设备,可能需要减小文本大小。

提前致谢!

【问题讨论】:

    标签: java android button ontouchlistener


    【解决方案1】:

    看看NumberPicker source code。这是 SDK 中的一个小部件,它完全按照您的描述进行操作,但没有加速。像这里所做的那样使用对Handler 的发布调用是处理计时事件的最佳方式。您需要对此类进行的唯一添加是根据停机时间更改 post 回调(可能还有增量)中的 mSpeed 值。

    HTH。

    【讨论】:

    • +1 谢谢.. 我正在检查我的闹钟中的 TimePicker 是否正在加速,但事实并非如此,所以我跳过了认为我可以改变它的部分。如果我无法执行 Teds 和 C0deAttacks 提案中的任何一个,我将尝试这个...
    • 虽然我真的很喜欢每一个提议,但这个对我帮助最大,因为我一直坚持如何正确使用线程。消息来源向我透露了它的秘密。请原谅我迟到了,我一直在忙私人事务。
    【解决方案2】:

    我可能尝试解决的方法如下:

    按 + 或 - 将启动一个线程。线程以设置的间隔通过偏移值更新数字,如果数字已更改超过 20 次,则减小间隔以使数字更新更快,如果数字仍然变化很大,则偏移值将变大到跳过数字。请记住,所有这些都发生在一个线程中。

    当用户抬起手指时,线程被终止并且偏移量、间隔被重置。

    【讨论】:

    • +1 感谢您的快速回复...我明天会试一试。 (已经过了就寝时间了:D)
    • 请注意不要尝试从非 UI 线程更新视图。如果您想尝试我的想法,最好阅读 Android 中的线程。
    • 感谢您的提示。我的代码示例只是一个示例......实际代码使用观察者模式,以便在模型更改时通知视图。
    【解决方案3】:

    使用getDownTime() 的值来计算计数器增量应该有多大。

    首先,设计您想要的响应曲线。 (也就是说,确定一个函数,该函数定义值应如何随着触摸时间的变化而变化,也许是起始值。它不——不应该,从你描述它的方式——是一个直线函数。)

    然后让你的增量跟随曲线。在最后一个事件中存储按钮值和停机时间可能会有所帮助。

    【讨论】:

    • +1 哦.. 真漂亮 getDownTime < 10000 / cycles 时尝试跳过一些奇怪的功能循环但这似乎根本没有做任何事情......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2021-05-01
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多