2015-04-04 61 views
0

末我有看法是这样的:动画/隐藏按钮时接近的ListView

view 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(); 
     } 
} 

回答

0

我很少使用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... 
      } 
    } 
} 
+0

谢谢,但我想按钮只隐藏在列表的末尾没有任何其他地方,所以如何检测使用onInterceptTouchEvent达到列表的结束? – user3626048 2015-04-04 22:01:22

+0

在这种情况下,我会反过来聆听ListView中的项目位置。看看我更新的答案和我提供的链接 - 这是未经测试的,但我将如何处理它。 – PPartisan 2015-04-04 22:22:46

0

您可以使用此library。这是Android L应用中使用的浮动按钮。

+0

谢谢,但是这不正是我想要的。我只想按钮隐藏在列表的末尾。 – user3626048 2015-04-04 22:02:34