- 隐藏标题栏
//启动文件中设置
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);
网友评论