如何在没有手指抬起的情况下检测滑动事件

Sus*_*ore 4 android

我想在连续向上滑动/向下滑动事件时递增/递减数字.我可以使用GestureDetector和OnSwipeTouchListener实现简单的滑动事件.

然而,仅在滑动之后抬起手指时才感测到该滑动事件.因此,为了将数字增加到+5,我要在屏幕上进行5次单独向上滑动.

我想应用"滑块"之类的操作,以便在用户在屏幕上的任何位置向上或向下滑动时更改数字.(我不想使用'Slider'小部件).

这可能吗?

任何帮助都会非常感激.谢谢!

Lui*_*wer 7

使用OnTouchListener:

private float baseX, baseY;

OnTouchListener listener = new OnTouchListener(){
    public boolean onTouch (View v, MotionEvent event)
    {
        switch(event.getAction())
        {
            case MotionEvent.ACTION_DOWN:
                //TOUCH STARTED
                baseX = event.getX();
                baseY = event.getY();
                return true;
            case MotionEvent.ACTION_MOVE:
                //FINGER IS MOVING
                //Do your calculations here, using the x and y positions relative to the starting values you get in ACTION_DOWN
                return true;
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:
                //TOUCH COMPLETED
                return true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Sus*_*ore 5

@ 1up,非常感谢解决方案!

我可以添加的增强功能即使在不抬起手指的情况下反转滑动方向,它也能正常工作.

使用您提供的骨架,发布我的代码,希望它将来会帮助某人...

public class OnSwipeListener implements OnTouchListener
{
    @Override
    public boolean onTouch(View v, MotionEvent event) 
    {
    boolean result = false;

    float currentX      = 0.0f;
    float currentY      = 0.0f;

    float current_diffX = 0.0f;
    float current_diffY = 0.0f;

    switch(event.getAction())
    {
        case MotionEvent.ACTION_DOWN:
            //Touch detected, record base X-Y coordinates
            baseX = event.getX();
            baseY = event.getY();

            //As the event is consumed, return true
            result = true;  
            break;

        case MotionEvent.ACTION_MOVE:
            //Swipe started, get current X-Y coordinates and compute those with the base ones
            currentX = event.getX();
            currentY = event.getY();

            current_diffX = currentX - baseX;
            current_diffY = currentY - baseY;

            //...................................................Determine horizontal swipe direction
            if(h_swipe == LEFT_SWIPE)
            {
                if( currentX > previousX )
                {
                    //If here, then horizontal swipe has been reversed
                    h_swipe = RIGHT_SWIPE;

                    //Overwrite base coordinate
                    baseX = previousX;

                    //Recalculate Difference
                    current_diffX = currentX - baseX;
                }
                else
                {
                    //NOP - Intentionally kept empty
                }
            }
            else if(h_swipe == RIGHT_SWIPE)
            {
                if( currentX < previousX )
                {
                    //If here, then horizontal swipe has been reversed
                    h_swipe = LEFT_SWIPE;

                    //Overwrite base coordinate
                    baseX = previousX;

                    //Recalculate Difference
                    current_diffX = currentX - baseX;
                }
                else
                {
                    //NOP - Intentionally kept empty
                }                   
            }
            else
            {
                //If here, then it's a fresh swipe event, so compare with base coordinates
                if( currentX < baseX )
                {
                    h_swipe = LEFT_SWIPE;
                }
                else if( currentX > baseX )
                {
                    h_swipe = RIGHT_SWIPE;
                }
                else
                {
                    //NOP - Intentionally kept empty
                }
            }

            //...................................................Determine vertical swipe direction 
            if(v_swipe == UP_SWIPE)
            {
                if(currentY > previousY)
                {
                    //If here, then vertical swipe has been reversed
                    v_swipe = DOWN_SWIPE;

                    //Overwrite base coordinate
                    baseY = previousY;

                    //Recalculate coordinate difference
                    current_diffY = currentY - baseY;
                }
                else
                {
                    //NOP - Intentionally kept empty
                }
            }
            else if(v_swipe == DOWN_SWIPE)
            {
                if(currentY < previousY)
                {
                    //If here, then vertical swipe has been reversed
                    v_swipe = UP_SWIPE;

                    //Overwrite base coordinate
                    baseY = previousY;

                    //Recalculate coordinate difference
                    current_diffY = currentY - baseY;
                }
                else
                {
                    //NOP - Intentionally kept empty
                }
            }
            else
            {
                //If here, then it's a fresh swipe event, so compare with base coordinates
                if( currentY < baseY )
                {
                    v_swipe = UP_SWIPE;
                }
                else if( currentY > baseY )
                {
                    v_swipe = DOWN_SWIPE;
                }
                else
                {
                    //NOP - Intentionally kept empty
                }
            }

            //Record current coordinates for future comparisons
            previousX = currentX;
            previousY = currentY;

            //................................Determine the prominent swipe (horizontal/vertical)
            if(Math.abs(current_diffX) > Math.abs(current_diffY))
            {
                //It's a horizontal swipe
                if (Math.abs(current_diffX) > SWIPE_THRESHOLD) 
                {
                    if (current_diffX > 0) 
                    {
                        onRightSwipe();
                    } 
                    else 
                    {
                        onLeftSwipe();
                    }
                }
                else
                {
                    //Not enough swipe movement, ignore.
                    //NOP - Intentionally kept empty
                }
            }
            else
            {
                //It's a vertical swipe
                if (Math.abs(current_diffY) > SWIPE_THRESHOLD) 
                {
                    if (current_diffY > 0) 
                    {
                        onDownSwipe();
                    } 
                    else 
                    {
                        onUpSwipe();
                    }
                }
                else
                {
                    //Not enough swipe movement, ignore.
                    //NOP - Intentionally kept empty
                }                   
            }

            //As the event is consumed, return true
            result = true;
            break;

        case MotionEvent.ACTION_UP:
            //Swipe ended, clear variables, if necessary
            h_swipe = NO_H_SWIPE;
            v_swipe = NO_V_SWIPE;

            baseX = 0.0f;
            baseY = 0.0f;

            previousX = 0.0f;
            previousY = 0.0f;

            //As the event is consumed, return true
            result = true;              
            break;

        default:

            //Do not consume event
            result = false;
            break;
    }

    return result;
}


public void onUpSwipe()
{

}

public void onDownSwipe()
{

}

public void onRightSwipe()
{

}

public void onLeftSwipe()
{

}
}
Run Code Online (Sandbox Code Playgroud)

  • 许多符号在此实现中尚未解决.大多数人都不知道他们是什么! (2认同)