2015-04-30 16 views
7

Używam następujący kodZwiększenie widoczności widokiem na Swipe za pomocą gestów w 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; 
    } 
}; 

Początkowo GestureLayout Widoczność jest GONE. Po przesunięciu widoczność wzrośnie z 0,3 do 0,8. Jeśli spróbuję przesunąć w lewo, zwiększa wartość alfa o View gdzieś na ekranie z tekstem podobnym (lewe przesuwanie), a także po prawej stronie.

Ten kod wydaje się działać, ale animacja alpha od niskiej do wysokiej nie jest standardowa.

Każda pomoc będzie pomocny

UWAGA: Nie muszę animację. Chcę, żeby było oparte na przesunięciu palca

+1

Witam Muhammadzie. Kiedy próbuję uruchomić twój kod, następujące symbole są niezdefiniowane: 'R.string.option_my_location',' R.string.option_onway', 'R.string.option_where',' SHOULD_CALL_ONMYWAY', 'SHOULD_CALL_WHERE',' gestureLayout', 'gestText',' sendLocBtn' i 'shouldCallBtn'. Czy możesz podać przykład minimalny, pełny i sprawdzalny (http://stackoverflow.com/help/mcve)? Wówczas będzie można łatwo odtworzyć problem, który masz, co znacznie ułatwi udzielenie ci dobrej odpowiedzi. –

+0

@MartinNordholts po prostu zamień je na cokolwiek lub skomentuj. Wykonaj jeden gest widzenia, który jest ważny, aby zwiększyć lub zmniejszyć jego widoczność. –

+0

"Ten kod wydaje się działać, ale animacja alpha od niskiej do wysokiej nie jest standardowa." Jaki jest problem? Chcesz, aby alfa było animowane podczas przeciągania? – SharpEdge

Odpowiedz

4

Przyjmijmy wartość 0.1fdeltaAlpha. deltaAlpha musi być oparte na wartości deltaX. Musisz zdefiniować współczynnik dla swojej aplikacji, który jest proporcją między deltaX i deltaAlpha. Na przykład powiedzmy, że 10px są równe 0.01 zmiana alfa. Teraz wiesz, że jeśli twój palec przesunie się na ekran o 40px, wartość alfa zostanie zmieniona na z 0.04 bez względu na szybkość gestu. W ten sposób animacja będzie płynna i będzie oparta na odległości przesuniętej palcem po ekranie. Spróbuj następującego kodu 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)); 
    } 
} 

połączenia incrementViewAlpha i decrementViewAlpha metod, jeśli chcesz zwiększyć lub zmniejszyć wartość alfa widoku danych,.

+0

Zgadzam się z Kirilem, ponieważ zmienność alfa powinna się proporcjonalnie zmieniać wraz z ruchem palca, aby osiągnąć gładki efekt. – Sameer

1

Ulepszyłem kod Kirila i uniknąłem niepotrzebnego kodu. Musisz zmodyfikować wartość COEFFICIENT, aby kontrolować zmienność/płynność w zależności od rozmiaru układu, rozmiaru ekranu, powiązanych parametrów itd. Daj mi znać, czy to działa dla Ciebie. Zmieniono też limit alfa na 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; 
} 
Powiązane problemy