美文网首页
android 自定义标题栏 状态栏颜色设置

android 自定义标题栏 状态栏颜色设置

作者: fordG | 来源:发表于2019-03-26 09:49 被阅读0次
    • 隐藏标题栏
    //启动文件中设置
    android:theme="@style/Theme.AppCompat.NoActionBar"
    
    • 自定义的nav标题栏, 可以自己完善
    package base.components;
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Color;
    import android.graphics.Typeface;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.Gravity;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    import androidx.annotation.Nullable;
    import androidx.core.content.ContextCompat;
    
    import com.example.learnandroid.R;
    
    import utils.GlobalModule;
    
    public class BaseNav extends LinearLayout {
            private TextView backText, centerText;
            private FontIconView backIcon;
            private LinearLayout areaLeft, areaCenter, areaRight, content;
            private String left, leftIcon;
            private int titleColor, backgroundColor, leftTextColor;
            private boolean fitStatus = true, showBack = false;
            private int marginH = 0;
    
            public  String title;
    
    
            public BackClick backClick;
    
            public BaseNav(Context context) {
                    this(context, null);
            }
    
            public BaseNav(Context context, @Nullable AttributeSet attrs) {
                    this(context, attrs, 0);
            }
    
            public BaseNav(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    
                    super(context, attrs, defStyleAttr);
                    //设置一些默认值
                    marginH = dp(10);
                    titleColor = ContextCompat.getColor(context, R.color.NavTitleColor);
                    leftTextColor = ContextCompat.getColor(context, R.color.NavLeftColor);
                    backgroundColor = ContextCompat.getColor(context, R.color.NavBackgroundColor);
    
                    //获取自定义属性 别人使用时可能在xml中使用属性,在下面获取 from nav_attr.xml(除非defStyleAttr为0(可以理解为theme中没有相关属性),否则程序根本不会去从我们的defStyleRes找属性值)
                    //解析属性的优先级: xml > style > defStyleAttr > defStyleRes > theme
                    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BaseNav);
                    for (int i = 0; i < typedArray.getIndexCount(); i++) {
                            int attr = typedArray.getIndex(i);
                            switch (attr) {
                                    case R.styleable.BaseNav_backgroundColor:
                                            backgroundColor = typedArray.getColor(R.styleable.BaseNav_backgroundColor, ContextCompat.getColor(context, R.color.NavBackgroundColor));
                                            break;
                                    case R.styleable.BaseNav_leftIcon:
                                            leftIcon = typedArray.getString(R.styleable.BaseNav_leftIcon);
                                            break;
                                    case R.styleable.BaseNav_leftText:
                                            left = typedArray.getString(R.styleable.BaseNav_leftText);
                                            break;
                                    case R.styleable.BaseNav_leftTextColor:
                                            leftTextColor = typedArray.getColor(R.styleable.BaseNav_leftTextColor, ContextCompat.getColor(context, R.color.NavLeftColor));
                                            break;
                                    case R.styleable.BaseNav_title:
                                            title = typedArray.getString(R.styleable.BaseNav_title);
                                            break;
                                    case R.styleable.BaseNav_titleColor:
                                            titleColor = typedArray.getColor(R.styleable.BaseNav_titleColor, ContextCompat.getColor(context, R.color.NavTitleColor));
                                            break;
                                    case R.styleable.BaseNav_showBack:
                                            showBack = typedArray.getBoolean(R.styleable.BaseNav_showBack, true);
                                            break;
                                    case R.styleable.BaseNav_fitStatus:
                                            fitStatus = typedArray.getBoolean(R.styleable.BaseNav_fitStatus, true);
                                            break;
                            }
                    }
                    typedArray.recycle();
                    this.initViews(this, context);
            }
    
    
            @SuppressLint({"Range", "ResourceAsColor"})
            private void initViews(View view, Context context) {
                    //设置背景颜色
                    if (backgroundColor == 0) {
                            setBackgroundColor(ContextCompat.getColor(context, R.color.NavBackgroundColor));
                    } else {
                            setBackgroundColor(backgroundColor);
                    }
                    //内容高度
                    int contentHeight = dp(50);
                    //状态栏高度, 不需要状态栏为0
                    int topMargin = this.fitStatus ? GlobalModule.getStatusBarHeight(context) : 0;
    
                    //内容容器
                    content = new LinearLayout(context);
                    LinearLayout.LayoutParams contentLayoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, contentHeight);
    //                content.setPadding(marginH, topMargin, marginH, 0);
                    contentLayoutParams.setMargins(marginH, topMargin, marginH, 0);
                    contentLayoutParams.rightMargin = marginH;
                    content.setLayoutParams(contentLayoutParams);
    
                    //左边LinearLayout
    
                    areaLeft = createLinearLayout(LayoutParams.WRAP_CONTENT, contentHeight, context);
                    areaLeft.setBackgroundColor(Color.TRANSPARENT);
    //                areaLeft.setGravity(Gravity.CENTER_HORIZONTAL);
                    //左边icon
                    if (showBack) {
                            backIcon = new FontIconView(view.getContext());
                            LinearLayout.LayoutParams leftIconParams = new LayoutParams(dp(20), LayoutParams.MATCH_PARENT);
                            backIcon.setLayoutParams(leftIconParams);
                            backIcon.setGravity(Gravity.CENTER);
                            backIcon.setTextColor(R.color.NavLeftColor);
                            backIcon.setTextSize(15);
                            backIcon.setTextColor(leftTextColor);
    
    
                            if (leftIcon == null) {
                                    Typeface iconFont = Typeface.createFromAsset(view.getContext().getAssets(), "iconfont.ttf");
                                    backIcon.setTypeface(iconFont);
                                    backIcon.setText(R.string.back);
                            } else {
                                    backIcon.setText(leftIcon);
                            }
                            areaLeft.addView(backIcon);
    
                            //左边文字
                            backText = new TextView(context);
                            backText.setText(left);
                            backText.setLines(1);
                            backText.setGravity(Gravity.CENTER);
                            backText.setTextColor(R.color.NavLeftColor);
                            backText.setTextSize(13);
                            backText.setTextColor(leftTextColor);
    
                            LinearLayout.LayoutParams leftTextParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
                            backText.setLayoutParams(leftTextParams);
    
                            areaLeft.addView(backText);
                    }
                    areaLeft.setOnClickListener(new OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                    backClick.click();
                            }
                    });
    
                    Log.i("areLeftLog:", String.valueOf(linearLyoutWidth(areaLeft)));
    
                    //中间文字
                    areaCenter = new LinearLayout(context);
                    LinearLayout.LayoutParams layoutParamsCenter = new LayoutParams(0, LayoutParams.MATCH_PARENT, 1);
                    layoutParamsCenter.gravity = Gravity.CENTER;
                    areaCenter.setLayoutParams(layoutParamsCenter);
                    if (title != null && !title.isEmpty()) {
                            //有标题
                            centerText = new TextView(context);
                            LinearLayout.LayoutParams centerParams = new LayoutParams(0, LayoutParams.MATCH_PARENT, 1);
                            centerText.setLayoutParams(centerParams);
                            centerText.setGravity(Gravity.CENTER);
                            centerText.setTextSize(16);
                            centerText.setText(title);
                            centerText.setTextColor(titleColor);
                            areaCenter.addView(centerText);
                    }
                    areaRight = createLinearLayout(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT, context);
                    setTitleCenter();
                    content.addView(this.areaLeft);
                    content.addView(areaCenter);
                    content.addView(areaRight);
                    addView(content);
            }
    
            private void setTitleCenter(){
                    if(title != null && !title.isEmpty()){
                            //设置文字剧中 areaCenter边距左右各10
                            int left = linearLyoutWidth(areaLeft);
                            int right = linearLyoutWidth(areaRight);
                            int tmpValue = Math.abs((left - right));
                            if(left > right){
                                    areaCenter.setPadding(10, 0, (10 + tmpValue), 0);
                            }else{
                                    areaCenter.setPadding((10 + tmpValue), 0, 10, 0);
                            }
                    }
            }
    
            private LinearLayout createLinearLayout(int width, int height, Context context) {
                    LinearLayout linearLayout = new LinearLayout(context);
                    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(GlobalModule.dp2px(context, width), height);
                    linearLayout.setLayoutParams(layoutParams);
                    return linearLayout;
            }
    
            //获取自定义LinearLayout宽度
            private int linearLyoutWidth(LinearLayout linearLayout) {
                    linearLayout.measure(0, 0);
                    return linearLayout.getMeasuredWidth();
            }
    
            public void customLeft(LinearLayout linearLayout) {
                    areaLeft.removeAllViews();
                    areaLeft.addView(linearLayout);
                    setTitleCenter();
            }
    
            public void customCenter(LinearLayout linearLayout) {
                    //隐藏centerText
                    areaCenter.removeAllViews();
                    areaCenter.addView(linearLayout);
            }
    
            private int dp(int px) {
                    return GlobalModule.dp2px(getContext(), px);
            }
    
            public void customRight(LinearLayout linearLayout) {
                    areaRight.removeAllViews();
                    areaRight.addView(linearLayout);
                    setTitleCenter();
            }
    
            public interface BackClick {
                    public void click();
            }
    }
    
    
    
    package utils;
    
    import android.content.Context;
    import android.content.res.Resources;
    
    public class GlobalModule {
           public static boolean isDebug = true;
           public static String APP_NAME = "";
    
           /**
            * 获取状态栏高度
            * @param context
            * @return
            */
           public static int getStatusBarHeight(Context context) {
                  Resources resources = context.getResources();
                  int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
                  int height = resources.getDimensionPixelSize(resourceId);
                  return height;
           }
    
           public static int dp2px(Context context, float dpValue) {
                  float density = context.getResources().getDisplayMetrics().density;
                  return (int) (dpValue * density + 0.5f);
           }
    
           public static int sp2px(Context context, float spValue) {
                  float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
                  return (int) (spValue * fontScale + 0.5f);
           }
    
           public static int px2dp(Context context,float pxValue) {
                  float density = context.getResources().getDisplayMetrics().density;
                  return (int) (pxValue / density + 0.5f);
           }
    
           public static int px2sp(Context context, float pxValue) {
                  float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
                  return (int) (pxValue / fontScale + 0.5f);
           }
    }
    
    

    自定义的nav属性


    image.png
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="BaseNav">
            <attr name="leftText" format="string"/>
            <attr name="leftTextColor" format="color" />
            <attr name="title" format="string" />
            <attr name="titleColor" format="color" />
            <attr name="leftIcon" format="string" />
            <attr name="backgroundColor" format="color" />
    <!--        适配状态栏, 需要让状态栏透明-->
            <attr name="fitStatus" format="boolean" />
            <attr name="showBack" format="boolean" />
        </declare-styleable>
    </resources>
    

    在布局文件中使用

    <base.components.BaseNav
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:title="首页"
            app:showBack="false"
            app:leftText="返回"
            app:fitStatus="false"
            tools:ignore="MissingConstraints" />
    
    • 全局设置状态栏颜色
    //状态栏透明
            public static void makeStatusBarTransparent(Activity activity) {
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                            return;
                    }
                    Window window = activity.getWindow();
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                            int option = window.getDecorView().getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
                            window.getDecorView().setSystemUiVisibility(option);
                            window.setStatusBarColor(Color.TRANSPARENT);
                    } else {
                            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                    }
            }
    
    • 使用提示: 不需要状态栏请透明, fitStatus是否需要适配状态栏高度


      image.png
    nav = findViewById(R.id.nav);
                    LinearLayout linearLayout = ActivitySetting.createLinearLayout(100, LinearLayout.LayoutParams.MATCH_PARENT, this);
                    linearLayout.setBackgroundColor(Color.WHITE);
    
                    LinearLayout linearLayout2 = ActivitySetting.createLinearLayout(150, LinearLayout.LayoutParams.MATCH_PARENT, this);
                    linearLayout2.setBackgroundColor(Color.YELLOW);
    
                    nav.customLeft(linearLayout);
                    nav.customRight(linearLayout2);
    

    相关文章

      网友评论

          本文标题:android 自定义标题栏 状态栏颜色设置

          本文链接:https://www.haomeiwen.com/subject/emclvqtx.html