在 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
值。
您必须为您的应用程序定义一个系数,即 deltaX
和 deltaAlpha
之间的比率。
例如,假设 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 值时调用 incrementViewAlpha
和 decrementViewAlpha
方法。
我改进了 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;
}
我正在使用以下代码
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
值。
您必须为您的应用程序定义一个系数,即 deltaX
和 deltaAlpha
之间的比率。
例如,假设 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 值时调用 incrementViewAlpha
和 decrementViewAlpha
方法。
我改进了 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;
}