Android - 如何使用交叉淡入淡出动画更改状态栏颜色[重复]

Posted

技术标签:

【中文标题】Android - 如何使用交叉淡入淡出动画更改状态栏颜色[重复]【英文标题】:Android - How to change status bar color with crossfade animation [duplicate] 【发布时间】:2018-12-11 12:03:21 【问题描述】:

我想用交叉淡入淡出动画实现变色状态栏,如下所示。我能知道怎么做吗?

状态栏变色动画:

谢谢!

已编辑(2018 年 7 月 7 日) - 伙计们,这不是重复的

不管怎样,我终于找到了使用 ValueAnimator 和 ArgbEvaluator 的解决方案。

val mColorAnimation = ValueAnimator.ofObject(ArgbEvaluator(), firstColor, secondColor, thirdColor, fourthColor) 

mColorAnimation.duration = (pageCount - 1) * 10000000000L

mColorAnimation.addUpdateListener  animator ->
    val color = animator.animatedValue as Int

    // change status, navigation, and action bar color
    window.statusBarColor = color
    window.navigationBarColor = color
    supportActionBar?.setBackgroundDrawable(ColorDrawable(color))


main_viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener
    override fun onPageScrollStateChanged(state: Int)  /* unused */ 
    override fun onPageSelected(position: Int)  /* unused */ 

    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) 
        mColorAnimation.currentPlayTime = ((positionOffset + position) * 10000000000).toLong()
    
)

【问题讨论】:

【参考方案1】:

github 上已经有一个库来展示如何使用圆形显示效果更改工具栏和状态栏颜色的动画。 Check this out.

这里是代码sn-p

public class MainActivity extends Activity 

    private View mRevealView;
    private View mRevealBackgroundView;
    private Toolbar mToolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mToolbar = (Toolbar) findViewById(R.id.appbar);
        mToolbar.setTitle(getString(R.string.app_name));

        mRevealView = findViewById(R.id.reveal);
        mRevealBackgroundView = findViewById(R.id.revealBackground);

        ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton);
        toggleButton.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                boolean on = ((ToggleButton) v).isChecked();

                if (on) 
                    animateAppAndStatusBar(R.color.primary, R.color.accent);
                 else 
                    animateAppAndStatusBar(R.color.accent, R.color.primary);
                
            
        );

        setActionBar(mToolbar);
    

    private void animateAppAndStatusBar(int fromColor, final int toColor) 
        Animator animator = ViewAnimationUtils.createCircularReveal(
                mRevealView,
                mToolbar.getWidth() / 2,
                mToolbar.getHeight() / 2, 0,
                mToolbar.getWidth() / 2);

        animator.addListener(new AnimatorListenerAdapter() 
            @Override
            public void onAnimationStart(Animator animation) 
                mRevealView.setBackgroundColor(getResources().getColor(toColor));
            
        );

        mRevealBackgroundView.setBackgroundColor(getResources().getColor(fromColor));
        animator.setStartDelay(200);
        animator.setDuration(125);
        animator.start();
        mRevealView.setVisibility(View.VISIBLE);
    

希望对你有帮助。

【讨论】:

如果您的答案只是发布链接,请在 cmets 中进行。【参考方案2】:

您可以通过这种方式以编程方式更改状态栏颜色。现在您可以在 ViewPager 监听器中更改状态栏颜色。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
    Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    window.setStatusBarColor(Color.RED);

【讨论】:

这只会设置状态栏颜色,但不会向用户显示任何动画。我认为它旨在通过动画更改状态栏颜色。 那些代码只是改变颜色没有动画,不是我要求的

以上是关于Android - 如何使用交叉淡入淡出动画更改状态栏颜色[重复]的主要内容,如果未能解决你的问题,请参考以下文章

looper.js 插件 - 交叉淡入淡出动画之间不可见的图像

使用 jQuery 动画制作具有 200 毫秒交叉淡入淡出的 img 切换源?

如何控制两个 UIImage 的无动画之间的淡入淡出?

SwiftUI - 使用淡入淡出动画更改文本

角度6背景图像交叉淡入淡出动画

如何在 Bootstrap 3 Carousel 中更改滑动动画以淡入/淡出过渡