在 android 中使用手势增加滑动视图的可见性

Increasing the visibility of a view on Swipe using Gestures in android

我正在使用以下代码

private GestureDetector.OnGestureListener mGestureListener = new GestureDetector.OnGestureListener()
{
    private float lastDeltaValue;
    private static final int MIN_DISTANCE = 15;
    private static final int MIN_DISTANCE_Y = 25;
    @Override
    public boolean onDown(MotionEvent e)
    {
        lastDeltaValue = 0;
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {

    }

    @Override
    public boolean onSingleTapUp(MotionEvent e)
    {
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
    {
        float startingX = (int)e1.getRawX();
        float startingY = (int)e1.getRawY();

        float endingX = (int)e2.getRawX();
        float endingY = (int)e2.getRawY();

        float deltaX = startingX - endingX;
        float deltaY = startingY - endingY;

        // swipe horizontal?
        if(Math.abs(deltaX) > MIN_DISTANCE && Math.abs(deltaY) < MIN_DISTANCE_Y)
        {
            // left or right
            if(deltaX > 0)
            {
                shouldCallBtn = SHOULD_CALL_WHERE;
                if (gestureLayout.getVisibility() == View.GONE)
                {
                    gestureLayout.setVisibility(View.VISIBLE);
                    gestureLayout.setAlpha(0.3f);
                }
                gestureText.setText(getString(R.string.option_where));
                if (deltaX > lastDeltaValue)
                {
                    if (gestureLayout.getAlpha() > 0.29 && gestureLayout.getAlpha() < 0.80)
                        gestureLayout.setAlpha(gestureLayout.getAlpha() + 0.1f);
                }
                else
                {
                    if (gestureLayout.getAlpha() < 0.81 && gestureLayout.getAlpha() > 0.29)
                        gestureLayout.setAlpha(gestureLayout.getAlpha() - 0.1f);
                }
                Log.d("DELTA VALUES", String.valueOf(deltaX) + "  ==  " + String.valueOf(lastDeltaValue) + "   " +String.valueOf(gestureLayout.getAlpha()));

                lastDeltaValue = deltaX;

            }
            else if(deltaX < 0)
            {
                shouldCallBtn = SHOULD_CALL_ONMYWAY;
                if (gestureLayout.getVisibility() == View.GONE)
                {
                    gestureLayout.setVisibility(View.VISIBLE);
                    gestureLayout.setAlpha(0.3f);
                }
                gestureText.setText(getString(R.string.option_onway));
                if (deltaX > lastDeltaValue)
                {
                    if (gestureLayout.getAlpha() > 0.29 && gestureLayout.getAlpha() < 0.80)
                        gestureLayout.setAlpha(gestureLayout.getAlpha() - 0.1f);
                }
                else
                {
                    if (gestureLayout.getAlpha() < 0.81 && gestureLayout.getAlpha() > 0.29)
                        gestureLayout.setAlpha(gestureLayout.getAlpha() + 0.1f);
                }
                Log.d("DELTA VALUES", String.valueOf(deltaX) + "  ==  " + String.valueOf(lastDeltaValue) + "   " +String.valueOf(gestureLayout.getAlpha()));

                lastDeltaValue = deltaX;
            }
        }
        else
        {
        }
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e)
    {
        gestureLayout.setVisibility(View.VISIBLE);
        gestureLayout.setAlpha(0.8f);
        gestureText.setText(getString(R.string.option_my_location));
        sendLocBtn.performClick();
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
    {
        return false;
    }
};

最初 GestureLayout 可见度为 GONE。滑动后其可见度将从 0.3 增加到 0.8。如果我尝试向左滑动,它会增加屏幕上某处 View 的 alpha,并带有一些文本(向左滑动),向右滑动也是如此。

这段代码似乎可以工作,但是 alpha 从低到高的动画不符合标准。

任何帮助都会有帮助

注意:我不需要动画。我希望它基于手指滑动

让我们调用 0.1f deltaAlpha 的值。 deltaAlpha 必须基于 deltaX 值。 您必须为您的应用程序定义一个系数,即 deltaXdeltaAlpha 之间的比率。 例如,假设 10px 等于 0.01 alpha 变化。现在您知道如果您的手指在屏幕上移动 40px,alpha 值将 无论手势速度如何,都可以用 0.04 进行更改。这样动画就会很流畅,并且会基于手指在屏幕上移动的距离。尝试以下 java 代码:

// 1 deltaX = 0.01 alpha
// This is just an example coefficient.
// Replace it with a value that fits your needs
private static final float COEFFICIENT = 0.01;

private float calculateDeltaAlpha(float deltaX) {
  return deltaX * COEFICIENT;
}

private void incrementViewAlpha(View view, float distanceX) {
  float oldAlpha = gestureLayout.getAlpha();
  if (oldAlpha > 0.29 && oldAlpha < 0.80) {
    gestureLayout.setAlpha(oldAlpha + calculateAlphaDelta(distanceX));
  }
}

private void decrementViewAlpha(View view, float distanceX) {
  float oldAlpha = gestureLayout.getAlpha();
  if (oldAlpha > 0.29 && oldAlpha < 0.80) {
    gestureLayout.setAlpha(oldAlpha - calculateAlphaDelta(distanceX));
  }
}

当您想增加或减少视图的 alpha 值时调用 incrementViewAlphadecrementViewAlpha 方法。

我改进了 Kiril 的代码并避免了不必要的代码。您需要修改 COEFFICIENT 值以根据布局大小、屏幕大小、相关参数等来控制 variation/smoothness。让我知道它是否适合您。还进行了更改以将 alpha 限制在 UPPER_BOUND_ALPHA & LOWER_BOUND_ALPHA.

private static final float COEFFICIENT = 0.0001f;
private static final float UPPER_BOUND_ALPHA = 0.8f;
private static final float LOWER_BOUND_ALPHA = 0.3f;

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
{
    float startingX = (int)e1.getRawX();
    float startingY = (int)e1.getRawY();

    float endingX = (int)e2.getRawX();
    float endingY = (int)e2.getRawY();

    float deltaX = startingX - endingX;
    float deltaY = startingY - endingY;

    // swipe horizontal?
    if(Math.abs(deltaX) > MIN_DISTANCE && Math.abs(deltaY) < MIN_DISTANCE_Y) 
    {
        if (gestureLayout.getVisibility() == View.GONE) 
        {
            gestureLayout.setVisibility(View.VISIBLE);
            gestureLayout.setAlpha(LOWER_BOUND_ALPHA);
        }

        // left or right
        if(deltaX > 0)
        {
            shouldCallBtn = SHOULD_CALL_WHERE;
            gestureText.setText(getString(R.string.option_where));
        }
        else if(deltaX < 0)
        {
            shouldCallBtn = SHOULD_CALL_ONMYWAY;
            gestureText.setText(getString(R.string.option_onway));
        }

        float alphaValue = gestureLayout.getAlpha() + COEFFICIENT * deltaX;
        if (alphaValue > UPPER_BOUND_ALPHA) 
        {
            alphaValue = UPPER_BOUND_ALPHA;
        } 
        else if (alphaValue < LOWER_BOUND_ALPHA) 
        {
            alphaValue = LOWER_BOUND_ALPHA;
        }

        gestureLayout.setAlpha(alphaValue);

        Log.d("DELTA VALUES", deltaX + "  ==  " + lastDeltaValue + "   " + gestureLayout.getAlpha());
        lastDeltaValue = deltaX;
    }

    return false;
}