2015-04-30 112 views
7

增加使用手勢刷卡視圖的可視性我使用下面的代碼在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從低到高的動畫不符合標準。

任何幫助將是有益的

注:我不需要的動畫。我希望它基於滑動的手指

+1

嗨穆罕默德。當我嘗試運行你的代碼時,下面的符號是未定義的:'R.string.option_my_location','R.string.option_onway','R.string.option_where','SHOULD_CALL_ONMYWAY','SHOULD_CALL_WHERE','gestureLayout', 'gestureText','sendLocBtn'和'shouldCallBtn'。您能否提供一個最小化,完整和可驗證的示例(http://stackoverflow.com/help/mcve)?然後,您可以輕鬆地重現您遇到的問題,爲您提供一個很好的答案更容易。 –

+0

@MartinNordholts只是用任何東西代替它們或將它們評論出來。使一個視圖gestureLayout對於增加或減少其可見性非常重要 –

+0

「此代碼似乎可行,但alpha從低到高的動畫不符合標準。」有什麼問題? 你想要在刷卡過程中alpha被動畫? – SharpEdge

回答

4

可以調用0.1fdeltaAlpha的值。 deltaAlpha必須基於deltaX值。 您必須爲您的應用定義一個係數,即deltaXdeltaAlpha之間的比率。 例如,可以說10px等於0.01阿爾法變化。現在你知道,如果你的手指在屏幕上移動了40px,alpha值將會改變0.04而不是手勢速度。這樣動畫就會平滑,並且將基於手指在屏幕上移動的距離。當你想增加或減少視圖的alpha值

// 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)); 
    } 
} 

呼叫incrementViewAlphadecrementViewAlpha方法:試試下面的Java代碼。

+0

與Kiril同意,因爲alpha變化應該與手指移動成比例地變化以實現平滑效果。 – Sameer

1

我改進了Kiril的代碼並避免了不必要的代碼。您需要修改COEFFICIENT值以根據佈局大小,屏幕大小,相關參數等來控制變化/平滑度。讓我知道它是否適合您。還對將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; 
}