【问题标题】:How can I animate the new Floating Action Button between tab/fragment transition?如何在选项卡/片段转换之间为新的浮动操作按钮设置动画?
【发布时间】:2015-09-27 23:06:14
【问题描述】:

从新的Design Support Library 开始,我想为浮动操作按钮 (FAB) 设置动画,使其随着片段或选项卡的变化而收缩和扩展。

我尝试了几种过渡方式,但无法像 this 中的示例那样平滑和连接,所以我认为有更好的方法或正确的方法来做到这一点。

【问题讨论】:

    标签: android floating-action-button


    【解决方案1】:

    ViewPager.OnPageChangeListener() 中,我将使用btn.setScaleY()btn.setScaleX(),具体取决于onPageScrolled() 方法的偏移量。

    【讨论】:

      【解决方案2】:

      Activity 类中,在ViewPager 中添加addOnPageChangeListener。见下文:

      viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                  private int state = 0;
                  private boolean isFloatButtonHidden = false;
                  private int position = 0;
      
                  @Override
                  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
      
                      if (isFloatButtonHidden == false && state == 1 && positionOffset != 0.0) {
                          isFloatButtonHidden = true;
      
                          //hide floating action button
                          swappingAway();
                      }
                  }
      
                  @Override
                  public void onPageSelected(int position) {
                      //reset floating
                      this.position = position;
      
                      if (state == 2) {
                          //have end in selected tab
                          isFloatButtonHidden = false;
                          selectedTabs(position);
      
                      }
                  }
      
                  @Override
                  public void onPageScrollStateChanged(int state) {
                      //state 0 = nothing happen, state 1 = begining scrolling, state 2 = stop at selected tab.
                      this.state = state;
                      if (state == 0) {
                          isFloatButtonHidden = false;
                      } else if (state == 2 && isFloatButtonHidden) {
                          //this only happen if user is swapping but swap back to current tab (cancel to change tab)
                          selectedTabs(position);
                      }
      
                  }
              });
      

      在您的私有方法中,您可以在那里执行自定义任务。

      private void swappingAway()
      {
          floatingActionButton.clearAnimation();
          Animation animation = AnimationUtils.loadAnimation(this, R.anim.pop_down);
          floatingActionButton.startAnimation(animation);
      }
      
      private void selectedTabs(int tab)
      {
          floatingActionButton.show();
      
          //a bit animation of popping up.
          floatingActionButton.clearAnimation();
          Animation animation = AnimationUtils.loadAnimation(this, R.anim.pop_up);
          floatingActionButton.startAnimation(animation);
      
          //you can do more task. for example, change color for each tabs, or custom action for each tabs.
      }
      

      我故意不使用hide()show(),因为它有错误,当您交换并立即返回时。

      这是 pop_down 和 pop_up 的动画

      pop_down.xml

      <scale xmlns:android="http://schemas.android.com/apk/res/android"
          android:fromXScale="1.0"
          android:fromYScale="1.0"
          android:toXScale="0.0"
          android:toYScale="0.0"
          android:duration="100"
          android:pivotX="50%"
          android:pivotY="50%"
          android:shareInterpolator="true"
          android:fillAfter="true">
      </scale>
      

      pop_up.xml

      <scale xmlns:android="http://schemas.android.com/apk/res/android"
          android:fromXScale="0.0"
          android:fromYScale="0.0"
          android:toXScale="1.0"
          android:toYScale="1.0"
          android:duration="500"
          android:pivotX="50%"
          android:pivotY="50%"
          android:startOffset="200"
          android:interpolator="@android:anim/bounce_interpolator"
          android:shareInterpolator="true"
          android:fillAfter="true">
      </scale>
      

      【讨论】:

        【解决方案3】:

        最简单的方法:

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
        
                @Override
                public void onPageSelected(int position) {}
        
                @Override
                public void onPageScrollStateChanged(int state) {
                    switch (state) {
                        case ViewPager.SCROLL_STATE_IDLE:
                            switch (viewPager.getCurrentItem()) {
                                case 0: {
                                    fab.setImageResource(R.drawable.your_drawable);
                                    fab.show();
                                    break;
                                }
                                case 1: {
                                    fab.setImageResource(R.drawable.your_another_drawable);
                                    fab.show();
                                    break;
                                }
                            }
                            break;
                        case ViewPager.SCROLL_STATE_DRAGGING:
                        case ViewPager.SCROLL_STATE_SETTLING:
                            fab.hide();
                            break;
                    }
        

        重要提示:要提高绘图性能,请尝试使用 .svg 格式或然后减小 png 的大小。

        【讨论】:

        • 我想要相同的结果,但在 android 上有一个底部导航视图。有没有优雅的方法?
        猜你喜欢
        • 2015-02-16
        • 2015-07-02
        • 2021-05-12
        • 2016-09-24
        • 1970-01-01
        • 2020-01-05
        • 1970-01-01
        • 2015-09-04
        • 1970-01-01
        相关资源
        最近更新 更多