Анимировать/скрыть кнопку, когда она близка к концу ListView

У меня вид такой:

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

ИЗМЕНИТЬ

Благодаря PPartisan я создал простой метод onScroll, который работает очень хорошо:

    public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {
        final int lastItem = firstVisibleItem + visibleItemCount;
        if(lastItem == totalItemCount & button.getVisibility() == View.VISIBLE & hideAnimStarted == false) {
            hideAnimStarted = true;
            ObjectAnimator animator = ObjectAnimator.ofFloat(button, View.TRANSLATION_Y, 100);
            animator.setDuration(300);
            animator.start();
            animator.addListener(new AnimatorListener() {                            
                @Override
                public void onAnimationStart(Animator animation) { }                            
                @Override
                public void onAnimationRepeat(Animator animation) { }                            
                @Override
                public void onAnimationEnd(Animator animation) {
                    button.setVisibility(View.GONE);    
                }                            
                @Override
                public void onAnimationCancel(Animator animation) {}
            });
        }
            else if(lastItem < totalItemCount & button.getVisibility() == View.GONE){                        
            button.setVisibility(View.VISIBLE);
            hideAnimStarted = false;                
            ObjectAnimator animator = ObjectAnimator.ofFloat(button, View.TRANSLATION_Y, 0);
            animator.setDuration(300);
            animator.start();
        }
}

person user3626048    schedule 04.04.2015    source источник


Ответы (1)


Я редко использую ListView вместо RecyclerView, но с RecyclerView я достигаю этого, реализуя OnInterceptTouchEvent. ListView также имеет такой же метод который вы можете переопределить. Сделав это, вы можете обнаруживать события прокрутки, прослушивая расстояние между событием опускания пальца и обновленной позицией после его перемещения:

private static final int TOUCH_SLOP = 200; //Set this to your preference.

int originalFingerPosition;
//...

@Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        switch (e.getAction()){
            case MotionEvent.ACTION_DOWN:
                originalFingerPosition = e.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                if (e.getY() - originalFingerPos > TOUCH_SLOP){
                    //This counts as a down swipe. Do something.
                } else if (e.getY() + TOUCH_SLOP < originalFingerPosition ){
                    //This is an upswipe. Do something else.
                }
            }
        return false;
        }

Не забудьте вернуть false, как только вы закончите, чтобы не использовать событие и не допустить, чтобы другие представления вели себя так, как они должны с прокруткой.

После этого остается только запустить подходящую анимацию, например TranslateAnimation, чтобы прокрутить кнопку за пределы экрана.

EDIT: Если вы хотите, чтобы анимация происходила только при достижении последнего элемента списка, я бы вместо этого взглянул на этот ответ и включите туда код для анимации Button выключенного экрана:

Адаптировано из примера, приведенного в этом. опубликовать

listView.setOnScrollListener(OnScrollListener);
//...
@Override
public void onScroll(AbsListView lw, final int firstVisibleItem,
             final int visibleItemCount, final int totalItemCount) {

switch(lw.getId()) {
    case android.R.id.list:
         final int lastItem = firstVisibleItem + visibleItemCount;
         if((lastItem == totalItemCount) && (button.getVisibility() == View.VISIBLE)) {
          Animation translate = new TranslateAnimation(
                    originalXPosition, originalXPosition,  originalYPosition, listView.getHeight());
            translate.setDuration(250);
            translate.setInterpolator(new LinearInterpolator());
            button.startAnimation(translate);
            button.setEnabled(false);
            button.setVisibility(View.GONE);
          } else {
          //The Opposite...
          }
     }
}
person PPartisan    schedule 04.04.2015
comment
Спасибо, но я хочу скрыть кнопку только в конце списка, а не где-либо еще, так как определить достижение конца списка с помощью onInterceptTouchEvent? - person user3626048; 05.04.2015
comment
В этом случае я бы вместо этого посмотрел на прослушивание позиций элементов в самом ListView. Взгляните на мой обновленный ответ и ссылку, которую я предоставил - она ​​не проверена, но как бы я к ней подошел. - person PPartisan; 05.04.2015