[英]Change a value smoothly increasing in speed by holding down a button
我几天来一直在蒸蒸日上。 我尝试为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;
}
}
对于分辨率较低的设备,可能必须减小文本大小。
提前致谢!
看一下NumberPicker源代码 。 这是SDK中的小部件,除了没有加速之外,它确实可以执行您所描述的操作。 像在此处那样使用对Handler
后调用是处理计时事件的最佳方法。 您需要对此类进行的唯一添加操作是根据停机时间更改post回调中的mSpeed
值(并可能更改增量)。
HTH。
我尝试解决此问题的方法如下:
按+或-将启动线程。 线程以偏移量值按设置的时间间隔更新数字,如果数字已更改20次以上,则减小间隔,以便数字更新更快;如果数字仍在变化很多,则偏移量值将增大为跳过数字。 记住所有这些都是在线程中发生的。
当用户抬起手指时,线程被杀死,并且偏移,间隔被重置。
使用getDownTime()
的值可以计算计数器的增量。
首先,设计您想要的响应曲线。 (也就是说,确定一个函数,该函数定义该值应如何随触摸时间以及可能是起始值而变化。从描述的角度来看,它不应是直线函数。)
然后,使您的增量遵循曲线。 在上一次事件中可能有助于存储按钮值和停机时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.