安卓浮动操作按钮动画

6
我只需要一个简单的动画,当滚动视图移动时。我尝试了一些解决方案,但没有一个完美/流畅地工作。如果我滚动,我想用向下滑动的动画隐藏fab,如果2秒后什么也没发生,fab就会用向上滑动的动画显示出来。我知道这是一个基本的问题,感谢您的耐心。
提前致谢。
final ScrollView scroll = (ScrollView) v.findViewById(R.id.sw);
scroll.setOnTouchListener(new View.OnTouchListener()){
   @Override
   public boolean onTouch(View v, Motionevent event){
      int action = event.getAction();
      if (action == Motionevent.ACTION_MOVE){

      //slide down animation here

      }else{
        new Handler().postDelayed(new Runnable(){
          public void run(){

          //slide up animation here

          }
        }, 2000);
      }
    return false;
  }
});
1个回答

14

这是一个教程,介绍如何使用带有滚动动画的浮动操作按钮(FAB)。

基本上:

  1. 使用v22.2.1支持v4库,该库提供了show()hide()方法,可以为浮动操作按钮执行淡入和淡出动画
  2. 必须将ScrollView和FAB放在CoordinatorLayout中。
  3. 将FAB的layout_anchor设置为ScrollViewid
  4. 创建一个类并扩展FloatingActionButton.Behavior类,并将其设置为布局xml中FAB的layout_behavior属性
  5. 覆盖您的Behavior类的onStartNestedScroll方法以检查是否为垂直
  6. 覆盖您的Behavior类的onStopNestedScroll方法,在向下滚动时调用子项(FAB)参数的hide()方法,并延迟2秒后发布一个Runnable以显示FAB

布局如下:

<android.support.design.widget.CoordinatorLayout
... >
    <ScrollView
    android:id="@+id/myList"
    ...
    />
        <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        app:layout_anchor="@id/myList"
        app:layout_behavior="package.CustomScrollAwareBehavior"
        ...
        />
    </android.support.design.widget.CoordinatorLayout>

我建议在Behavior类中创建一个Handler,调用FAB的show()方法。 Behavior类如下(未经测试):

public class CustomScrollAwareBehavior extends FloatingActionButton.Behavior{

private Handler handler = new Handler();
private FloatingActionButton fab;

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

@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout,
                                   FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) {
    fab = child;
    return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL ||
            super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target,
                    nestedScrollAxes);
}



Runnable showRunnable = new Runnable() {
    @Override
    public void run() {
        fab.show();
    }
};


@Override
public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child,
                           View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
    super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed,
            dyUnconsumed);
     if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) {
        handler.removeCallbacks(showRunnable);
        handler.postDelayed(showRunnable,2000);
        child.hide();
    } 
    }
}

谢谢!非常准确的答案,我会尽快尝试这个解决方案。 - t0thkr1s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接