动画修改Toolbar、TabLayout和StatusBar背景色

在使用别的APP时,TabLayout、Toolbar和StatusBar颜色会随着动画更改,就像下面这样:

实现方式也很简单,为了使当前颜色改变,并使用动画,我们需要在TabLayout.OnTabSelectedListener的监听中实现onTabSelected(TabLayout.Tab tab)方法。

为了使颜色改变有动画效果,这里我使用了ValueAnimator,设置动画时间和ArgbEvaluator来处理两个ARGB颜色之间的动画步骤。

具体方式:

public class UpdateToolbarColorActivity extends AppCompatActivity {
    private TabLayout tabLayout;
    private Toolbar toolbar;
    private String[] colors = {"红", "绿", "蓝", "紫", "灰"};

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_update_toolbar_color_layout);
        tabLayout = (TabLayout) findViewById(R.id.id_tab_layout);
        toolbar = (Toolbar) findViewById(R.id.toolbar);

        for (String color : colors) {
            tabLayout.addTab(tabLayout.newTab().setText(color));
        }

        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                //获取每次颜色的初始值
                int colorFrom = ((ColorDrawable) toolbar.getBackground()).getColor();
                int colorTo = getColorForTab(tab.getPosition());
                //使颜色改变有动画效果
                ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
                //动画执行时间
                colorAnimation.setDuration(1000);
                //动画监听器
                colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animator) {
                        int color = (int) animator.getAnimatedValue();
                        //修改toolbar背景颜色
                        toolbar.setBackgroundColor(color);
                        //修改tablayout背景颜色
                        tabLayout.setBackgroundColor(color);
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            //修改状态栏背景颜色
                            getWindow().setStatusBarColor(color);
                        }
                    }
                });
                //执行动画
                colorAnimation.start();
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
    }

    /**
     * 每个tab所对应的颜色值
     */
    public int getColorForTab(int position) {
        if (position == 0) return ContextCompat.getColor(this, R.color.red);
        else if (position == 1) return ContextCompat.getColor(this, android.R.color.holo_green_light);
        else if (position == 2) return ContextCompat.getColor(this, R.color.blue_color);
        else if (position == 3) return ContextCompat.getColor(this, android.R.color.holo_purple);
        else return ContextCompat.getColor(this, android.R.color.darker_gray);
    }
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                             xmlns:app="http://schemas.android.com/apk/res-auto"
                                             android:layout_width="match_parent"
                                             android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/d_56"
        android:background="@color/white"
        ></android.support.v7.widget.Toolbar>

    <android.support.design.widget.TabLayout
        android:id="@+id/id_tab_layout"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="#fff"
        android:fillViewport="false"
        app:tabMode="fixed"
        app:layout_scrollFlags="scroll"
        app:tabIndicatorColor="#d7e3"
        app:tabIndicatorHeight="2dp"
        app:tabSelectedTextColor="#d713"
        app:tabTextColor="#ced0d3"
        app:tabTextAppearance="@style/MyCustomTextAppearance"
        >

    </android.support.design.widget.TabLayout>

</android.support.design.widget.CoordinatorLayout>

好了,到这里就结束了,具体步骤就这么多。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一“技”之长

Android开发中TableLayout表格布局

        在移动端应用程序开发中,常常会使用到表格布局,iOS和Android开发框架中都提供了独立的表格视图控件供开发者使用,例如iOS中的UITabl...

863
来自专栏三好码农的三亩自留地

教你搞定Android自定义ViewGroup

我们知道ViewGroup就是View的容器类,我们经常用的LinearLayout,RelativeLayout等都是ViewGroup的子类,因为ViewG...

621
来自专栏CodingBlock

Android查缺补漏(View篇)--自定义 View 的基本流程

View是Android很重要的一部分,常用的View有Button、TextView、EditView、ListView、GridView、各种layout等...

34410
来自专栏Sorrower的专栏

动画必须有(二):悬浮菜单了解一下!

1183
来自专栏Android开发指南

15.屏幕适配

3488
来自专栏everhad

[BOT]自定义ViewPagerStripIndicator

效果图 app中下面这样的控件很常见,像默认的TabHost表现上不够灵活,下面就简单写一个可以结合ViewPager切换内容显示,提供底部“滑动条”指示所显示...

2005
来自专栏非著名程序员

AutoFlowLayout-多功能流式布局与网格布局控件

近期工作需要用到流式布局,网上也有很多关于这方面的资料。发现流式布局与网格布局的自定义很有意思,是学习自定义控件的一个很好的方式,所以就撸了个几百行代码的控件,...

31810
来自专栏编程之路

Android 深入(一)- 自定义View之BottomTitleImageView

1)从图中我们View的整个生命周期,主要由三部分操作完成分别是measure()、layout()、draw(),作用如下:

994
来自专栏向治洪

android自定义xmls文件属性

在使用到自定义View的xml布局文件中需要加入xmlns:前缀=http://schemas.android.com/apk/res/你的自定义View所在...

1885
来自专栏Android开发指南

Scrollview回弹效果自定义控件

2935

扫码关注云+社区