Увеличение видимости представления на Swipe с помощью жестов в 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 где-то на экране с некоторым текстом (левое прокручивание), и это происходит при правильном прокрутке.

Этот код, похоже, работает, но анимация альфы от низкого до высокого не соответствует стандарту.

Любая помощь будет полезна

ПРИМЕЧАНИЕ. Мне не нужна анимация. Я хочу, чтобы это было основано на палец пальца

Solutions Collecting From Web of "Увеличение видимости представления на Swipe с помощью жестов в android"

Позволяет вызвать значение 0.1f deltaAlpha . deltaAlpha должна основываться на значении deltaX . Вы должны определить коэффициент для вашего приложения, который является отношением между deltaX и deltaAlpha . Например, скажем, что 10px равны 0.01 альфа-изменению. Теперь вы знаете, что если ваш палец перемещается на 40px на экране, альфа-значение будет изменено с 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)); } } 

decrementViewAlpha методы incrementViewAlpha и decrementViewAlpha когда вы хотите увеличить или уменьшить альфа-значение.

Я улучшил код Кирилла и избегал ненужного кода. Вам необходимо изменить значение COEFFICIENT для управления изменением / гладкостью в зависимости от размера макета, размера экрана, связанных параметров и т. Д. Сообщите мне, работает ли оно для вас. Также были внесены изменения для ограничения альфы в пределах 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; }