自定义ToolBar沉浸式适配

来源:互联网 发布:c语言简单小程序游戏 编辑:程序博客网 时间:2024/06/10 14:53

1.自定义ImmersiveBar继承ToolBar (v7)

public class ImmersiveBar extends Toolbar {    private ImageView navigation;    private TextView title;    private ImageView img;    public ImmersiveBar(Context context) {        this(context, null);    }    public ImmersiveBar(Context context, @Nullable AttributeSet attrs) {        this(context, attrs, 0);    }    public ImmersiveBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        View view = View.inflate(context, R.layout.toolbar, this);        navigation = view.findViewById(R.id.toolbar_navigation);        title = view.findViewById(R.id.toolbar_title);        img = view.findViewById(R.id.toolbar_img);    }    public void setTitleTextColor(int colorRes) {        title.setVisibility(View.VISIBLE);        title.setTextColor(colorRes);        if (navigation.getVisibility() == View.VISIBLE) {            navigation.setColorFilter(colorRes, PorterDuff.Mode.SRC_ATOP);        }        if (img.getVisibility() == View.VISIBLE) {            img.setColorFilter(colorRes, PorterDuff.Mode.SRC_ATOP);        }        invalidate();    }    public void setTitleText(int stringRes) {        title.setVisibility(View.VISIBLE);        title.setText(stringRes);        invalidate();    }    public void setNavigationImg(int ImgRes) {        navigation.setVisibility(View.VISIBLE);        navigation.setBackgroundResource(ImgRes);        invalidate();    }    public void setNavigationClickListener(OnClickListener listener) {        navigation.setOnClickListener(listener);    }    public void setRightImg(int ImgRes) {        img.setVisibility(View.VISIBLE);        img.setBackgroundResource(ImgRes);        invalidate();    }    public void setRightImgClickListener(OnClickListener listener) {        img.setOnClickListener(listener);    }}

布局文件 toolbar.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="56dp"    android:background="@color/colorPrimary">    <ImageView        android:id="@+id/toolbar_navigation"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerVertical="true"        android:layout_marginLeft="10dp"        android:background="?selectableItemBackground"        android:clickable="true"        android:visibility="gone" />    <TextView        android:id="@+id/toolbar_title"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerInParent="true"        android:layout_centerVertical="true"        android:layout_marginLeft="64dp"        android:layout_marginRight="64dp"        android:ellipsize="end"        android:gravity="center"        android:singleLine="true"        android:textColor="@android:color/black"        android:textSize="18dp"        android:visibility="gone" />    <ImageView        android:id="@+id/toolbar_img"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:layout_centerVertical="true"        android:layout_marginRight="10dp"        android:background="?selectableItemBackground"        android:clickable="true"        android:visibility="gone" />    <View        android:layout_width="match_parent"        android:layout_height="1dp"        android:layout_alignParentBottom="true"        android:background="@android:color/darker_gray" /></RelativeLayout>

2.创建布局 base_toolbar.xml 添加自定义ToolBar

<?xml version="1.0" encoding="utf-8"?><com.wdx.statusbardemo.ImmersiveBar xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/base_toolbar"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:background="@color/colorPrimary"    android:minHeight="56dp"    android:paddingTop="25dp" />

3.在Activity中引入布局 base_toolbar.xml

<include layout="@layout/base_toolbar" />

4.在BaseActivity中对ImmersiveBar进行适配

private void initToolbar() {        if (Build.VERSION.SDK_INT >= 21) {            View decorView = getWindow().getDecorView();            int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;            decorView.setSystemUiVisibility(option);            getWindow().setStatusBarColor(Color.TRANSPARENT);        }        ImmersiveBar toolBar = (ImmersiveBar) findViewById(R.id.base_toolbar);        if (toolBar != null) {            int statusBarHeight = -1;            int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");            if (resourceId > 0) {                statusBarHeight = getResources().getDimensionPixelSize(resourceId);            }            int height = ((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,                    56, getResources().getDisplayMetrics()));            int padding_top = ((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,                    10, getResources().getDisplayMetrics()));            int miniHeight = height - statusBarHeight;            if (Build.VERSION.SDK_INT < 21) {                LinearLayout.LayoutParams linearParams = (LinearLayout.LayoutParams)                        toolBar.getLayoutParams();                linearParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;                linearParams.width = LinearLayout.LayoutParams.MATCH_PARENT;                toolBar.setLayoutParams(linearParams);                toolBar.setMinimumHeight(miniHeight);                toolBar.setPadding(0, padding_top, 0, 0);            }            setToolBar(toolBar); //回调方法        }    }

5.总结

重点在于根据版本设置状态栏透明与paddingTop的值。

原创粉丝点击