android 全屏与非全屏切换时 Toolbar 的显示, 仿微信漂流瓶效果

1,759 阅读2分钟
原文链接: blog.csdn.net

Toolbar已经代替了actionbar,特别是在4.4或更高版本上可以有沉浸式效果,要使用Toolbar还要配置相关的Noactionbar style样式,但是如果在全屏与非全屏切换时,如何使用Toolbar并实现沉浸式样式, 又要保证界面布局在全屏与非全屏时大小不会改变.

更多文章请关注:blog.csdn.net/u012216274

先看效果图吧, 这是4.4以下效果
这里写图片描述
4.4或更高版本效果
这里写图片描述

1:要使用Toolbar,实现沉浸式所以样式得使用Noactionbar, 并设置windowFullscreen 为true

这里写图片描述

2:Toolbar布局与设置, 这里不能使用LinearLayout,否则界面中的布局内容会在toolbar内容下面

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/piaoliupin"
        android:fitsSystemWindows="true"
        android:scaleType="fitXY"/>

    <android.support.v7.widget.Toolbar
        android:id="@+id/mToolbar"
        android:layout_width="match_parent"
        android:layout_height="52dp"
        android:minHeight="52dp"
        app:titleMarginStart="0dp"
        app:contentInsetStart="0dp"
        app:contentInsetRight="0dp"
        app:contentInsetEnd="0dp"
        android:background="?attr/colorPrimary" />

</RelativeLayout>
/**
     * 由于全屏时转非全屏时界面中的布局大小不能改变,所以不能使用流行的在windows中添加一个
     * Status 高度的控件来填充内容,  直接使用toolbar设置padding效果
     * @param activity
     * @param toolbar
     */
    public static void setStatusBarColor(Activity activity, Toolbar toolbar) {
        if (toolbar.getTag() == null ) {
            ViewGroup.LayoutParams params = toolbar.getLayoutParams();
            int statusHeight = getStatusHeight(activity);
            params.height += statusHeight;
            toolbar.setLayoutParams(params);
            toolbar.setPadding(toolbar.getPaddingLeft(), toolbar.getPaddingTop() + statusHeight,
                    toolbar.getPaddingRight(), toolbar.getPaddingBottom());
            toolbar.setTag(true);
            //toolbar默认有16dp的margin值,可以设置为0,或在布局中配置
            toolbar.setContentInsetsRelative(0,0);
        }
        if (hasKitKat()) {  //设置显示toolbar时的样式
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

3:最后就是些全屏与非全屏时的设置与动画

private void full(boolean enable) {
    if (!enable){
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); //非全屏
        mToolbar.clearAnimation();
        Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.top_translate_enter);
        mToolbar.setAnimation(animation);
        ConfigUtils.setStatusBarColor(MainActivity.this, mToolbar);
        mToolbar.setVisibility(View.VISIBLE);
        animation.start();
    }else{
        mToolbar.clearAnimation();
        Animation animation = AnimationUtils.loadAnimation(this, R.anim.top_translate_exit);
        mToolbar.setAnimation(animation);
        animation.start();
        mToolbar.setVisibility(View.GONE);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); //清除非全屏的flag
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); //设置全屏的flag
    }
}

最后附上源码 download.csdn.net/detail/u012…

更多文章请关注:blog.csdn.net/u012216274