2015-02-27 3 views
2

Я использую framelayout для хранения каждого из моих карт, и из которого я начинаю каждую анимацию движения (слева направо). Но я заметил, что это движение не выглядит невероятно гладким.Как я могу сделать движение своих карт более плавным?

Мой код ниже, что бы вы предложили, чтобы увеличить общую гладкость движения карты. Благодаря

MyFrameLayout:

public class MyFrameLayout extends FrameLayout { 

    private static int mWidth = 500; 
    MyFrameLayout touchFrameLayout; 

    public MyFrameLayout(Context context) { 
     super(context); 
     initialize(context); 
    } 

    public MyFrameLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initialize(context); 
    } 

    public MyFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     initialize(context); 
    } 

    private void initialize(Context context) { 
     setOnTouchListener(mTouchListener); 
     touchFrameLayout = this; 

    } 

    private float mDisplacementX; 
    // private float mLastMoveX; 
    private float mDisplacementY; 
    private float mInitialTx; 
    private boolean mTracking; 
    private OnTouchListener mTouchListener = new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      mWidth = (int) touchFrameLayout.getLayoutParams().width; 
      switch (event.getActionMasked()) { 
       case MotionEvent.ACTION_DOWN: 

        mDisplacementX = event.getRawX(); 
        mDisplacementY = event.getRawY(); 

        mInitialTx = getTranslationX(); 

        return true; 

       case MotionEvent.ACTION_MOVE: 
        // get the delta distance in X and Y direction 
        float deltaX = event.getRawX() - mDisplacementX; 
        float deltaY = event.getRawY() - mDisplacementY; 
        // updatePressedState(false); 

        // set the touch and cancel event 
        if ((Math.abs(deltaX) > ViewConfiguration.get(getContext()) 
          .getScaledTouchSlop() * 2 && Math.abs(deltaY) < Math 
          .abs(deltaX)/2) 
          || mTracking) { 

         mTracking = true; 

         if (getTranslationX() <= mWidth/2 
           && getTranslationX() >= -(mWidth/2)) { 

          setTranslationX(mInitialTx + deltaX); 
          return true; 
         } 
        } 

        break; 

       case MotionEvent.ACTION_UP: 

        if (mTracking) { 
         mTracking = false; 
         float currentTranslateX = getTranslationX(); 

         if (currentTranslateX > (mWidth/10)) { 
          rightSwipe(); 
         } else if (currentTranslateX < -(mWidth*10)) { 
          leftSwipe(); 
         } 

         // comment this line if you don't want your frame layout to 
         // take its original position after releasing the touch 
         setTranslationX(0); 
         return true; 
        } else { 
         // handle click event 
         setTranslationX(0); 
        } 
        break; 
      } 
      return false; 
     } 
    }; 

    private void deleteCard() { 
      ... 
    } 


    private void rightSwipe() { 
     Toast.makeText(this.getContext(), "Swipe to the right", 
       Toast.LENGTH_SHORT).show(); 
    DeleteCard(); 
    } 

    private void leftSwipe() { 
     Toast.makeText(this.getContext(), "Swipe to the left", 
       Toast.LENGTH_SHORT).show(); 
     DeleteCard(); 
    } 
} 

Xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

      <com.example.testing.android.layout.MyFrameLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

    <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:card_view="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/taskViewContainer" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     app:cardElevation="8dp" 
     app:cardPreventCornerOverlap="false" 
     card_view:cardCornerRadius="8dp"> 

      ...... 

      </android.support.v7.widget.CardView> 
     </com.example.testing.android.layout.MyFrameLayout> 



</RelativeLayout> 

ответ

2

Для того, чтобы иметь более плавное движение ваших CardViews в вашей FrameLayout вы собираетесь использовать animation package, чтобы оживить ваш взглядов или их свойств. Есть много способов достичь этого, но Property Animation на сегодняшний день является самым простым способом. И это, безусловно, соответствует вашим потребностям, поскольку вы упоминаете, что движение, которое вас интересует, - это движение left to right. Вы можете анимировать CardView s для более плавного перехода на y axis.

Внимательно прочитайте документ this, чтобы выполнить то, что вы пожелаете.

Редактировать: Возможно, LayoutTransition будет вам полезна. Просмотрите видео this, чтобы узнать, что это. Короче говоря, когда вы добавляете/удаляете представления в своей ViewGroup, масштабирование переходов/измерений может быть анимировано.

Смежные вопросы