自定义ToolBar沉浸式适配

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的值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值