【问题标题】:Animate/hide button when close to end of ListView接近 ListView 末尾时的动画/隐藏按钮
【发布时间】:2015-04-04 21:05:22
【问题描述】:

我有这样的看法:

ListView 在整个屏幕上,并且按钮始终可见(在 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();
        }
}

【问题讨论】:

    标签: android android-listview android-scroll


    【解决方案1】:

    我很少使用ListView 而不是RecyclerView,但是对于RecyclerView,我通过实现OnInterceptTouchEvent 来实现这一点。 ListView 还具有您可以覆盖的 the same method。完成此操作后,您可以通过侦听手指按下事件与移动后更新位置之间的距离来检测滚动事件:

    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,将按钮滚动到屏幕外。

    编辑: 如果您只希望动画在您到达列表的最后一项时发生,那么我会改为查看this 答案并包含代码以在屏幕外为Button 设置动画:

    改编自this帖子中给出的示例

    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...
              }
         }
    }
    

    【讨论】:

    • 谢谢,但我只想在列表末尾隐藏按钮,而不是在其他任何地方,所以如何使用 onInterceptTouchEvent 检测到达列表末尾?
    • 在这种情况下,我会改为查看ListView 本身中项目的位置。看看我更新的答案和我提供的链接 - 它未经测试,但我将如何处理它。
    猜你喜欢
    • 2018-06-04
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2017-03-31
    • 2014-09-02
    • 1970-01-01
    • 2021-02-10
    相关资源
    最近更新 更多