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

  • 隐藏标题栏
//启动文件中设置
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


    
        
        
        
        
        
        

        
        
    

在布局文件中使用


  • 全局设置状态栏颜色
//状态栏透明
        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 自定义标题栏 状态栏颜色设置)