只需触摸即可通过滑动/滚动/拖动和正常输入更改EditText

时间:2013-04-17 07:48:25

标签: android android-edittext ontouchlistener motionevent

我想用两种方法来改变EditText字段的输入。 EditText字段仅允许数字(“12.34”格式)。

正常行为 当用户触摸EditText时,它应该显示键盘,并且表现得像普通的EditText字段

移动行为 当用户触摸并向上/向下拖动时,我希望EditText递增/递减。

我已经搜索过这种类型的实现,因为我希望更多的人有类似的实现,但无法找到它。

昨天我尝试了以下代码,但这不起作用。在拖动期间键盘仍然显示,使用睡眠也不是一个很好的实现。

希望有人能帮助我找到更好的解决方案。

提前致谢!

inputET.setOnTouchListener(otl);

private OnTouchListener otl = new OnTouchListener() {
   public boolean onTouch (View v, MotionEvent event) {

    if (v == inputET) {
        // to distinguish between touch and drag
        if (event.getX > 50) { // drag
            float oldPos = event.getX;
            thread.sleep(10);
            inputET.setText(Float.toString(Float.parseFloat(inputET.getText()) - oldPos - event.getX);
            return true;
        } else { // touch
            return false;
        }
   }
};

2 个答案:

答案 0 :(得分:1)

你的代码没问题,只需删除线程的睡眠并将其添加到显示EditText的活动中:

android:windowSoftInputMode="stateHidden"

我还会将此添加到您的if条件中:

if (event.getAction() == MotionEvent.ACTION_MOVE && event.getX() > 50)

在我的设备中测试过(Android> 4.0)并且有效,希望它可以帮助您:)

答案 1 :(得分:1)

float mLastMotionX;
@Override
public boolean onTouch(View v, MotionEvent ev) {
    // TODO Auto-generated method stub

    final int action = ev.getAction();
    final float x = ev.getX();
    switch (action) {
    case MotionEvent.ACTION_DOWN: 
    {
        mLastMotionX = x;
        break;
    }

    case MotionEvent.ACTION_MOVE: 
    {
        final int deltaY = (int) (x - mLastMotionX);

        if( Math.abs(deltaY) % 50 == 0 && deltaY != 0)
        {
            mLastMotionX  = x;
            float current = Float.valueOf(mTextView.getText().toString()) + deltaY;
            mTextView.setText("" + round(current, 2.0));
        }
        break;
    }


    }
    return true;
}


private double round( final float value, double precision  )
{
    precision = Math.pow(10, precision);
    return Math.round(value * precision) / precision;
}

您应该为EditText设置初始文本,例如10.34。