android自定义标题栏的封装(功能比较完善)

注意:标题栏已经适配沉浸式状态栏

废话不多说直接上代码:

package driver.daijia.com.driver.view;

import android.annotation.SuppressLint;

import android.content.Context;

import android.content.res.Resources;

import android.content.res.TypedArray;

import android.graphics.BitmapFactory;

import android.graphics.drawable.Drawable;

import android.support.annotation.ColorRes;

import android.support.annotation.Nullable;

import android.util.AttributeSet;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ImageView;

import android.widget.RelativeLayout;

import android.widget.TextView;

import driver.daijia.com.driver.R;

import driver.daijia.com.driver.frame.utils.DensityUtil;

import driver.daijia.com.driver.frame.utils.TextUtil;

import static android.view.Gravity.CENTER;

/**

* .----.

* _.'__    `.

* .--(Q)(OK)---/$\

* .' @          /$$$\

* :        ,  $$$$$

* `-..__.-' _.-\$$/

* `;_:    `"'

* .'"""""`.

* /,  FLY  ,\

* //        \\

* `-._______.-'

* ___`. | .'___

* (______|______)

* SongWenjun

* Created by dell

* on 2020/6/17

* The package is driver.daijia.com.driver.view

* This Class is ...  自定义沉浸式状态栏

*/

public class TitleBarView extends RelativeLayout {

    //---------------------------------------------定义id-------------------------------------------

    @SuppressLint("ResourceType")

    @android.support.annotation.IdRes

    int RL_TITLEBAR = 100001;

    @SuppressLint("ResourceType")

    @android.support.annotation.IdRes

    int TV_TITLE = 100002;

    @SuppressLint("ResourceType")

    @android.support.annotation.IdRes

    int IMG_FINIGH = 100003;

    @SuppressLint("ResourceType")

    @android.support.annotation.IdRes

    int IMG_MOVE = 100004;

    @SuppressLint("ResourceType")

    @android.support.annotation.IdRes

    int TV_DESCRIBE = 100005;

    RelativeLayout rlTitleBar;

    private TextView tvTitle;

    private ImageView imgFinish;

    private TextView tvDescribe;

    private ImageView imgMove;

    private boolean isMmersion;//是否使用沉浸式状态栏

    private String describe;//描述

    private String title;//标题

    private Drawable imgFinishsrc;//返回的图片值

    private Drawable imgMovesrc;//更多的图片值

    private int style;//风格

    //--------------------------------------------定义风格------------------------------------------

    public final static int STYLE_FINISH_TITLE = 0;

    public final static int STYLE_FINISH_TITLE_TEXT = 1;

    public final static int STYLE_FINISH_TITLE_MOVE = 2;

    public final static int STYLE_FINISH_TITLE_TEXT_MOVE = 3;

    public final static int STYLE_FINISH_TITLE_MOVE_TEXT = 4;

    public final static int STYLE_TITLE = 5;

    //------------------------------------------设置事件--------------------------------------------

    private OnFinishClick onFinishClick;//返回键的点击事件

    private OnMoveClick onMoveClick;//更多的点击事件

    private OnDescribeClick onDescribeClick;//描述的点击事件

    public void setOnFinishClick(OnFinishClick onFinishClick) {

        this.onFinishClick = onFinishClick;

    }

    public void setOnMoveClick(OnMoveClick onMoveClick) {

        this.onMoveClick = onMoveClick;

    }

    public void setOnDescribeClick(OnDescribeClick onDescribeClick) {

        this.onDescribeClick = onDescribeClick;

    }

    public TextView getTvTitle() {

        return tvTitle;

    }

    public void setTvTitle(TextView tvTitle) {

        this.tvTitle = tvTitle;

    }

    public ImageView getImgFinish() {

        return imgFinish;

    }

    public void setImgFinish(ImageView imgFinish) {

        this.imgFinish = imgFinish;

    }

    public TextView getTvDescribe() {

        return tvDescribe;

    }

    public void setTvDescribe(TextView tvDescribe) {

        this.tvDescribe = tvDescribe;

    }

    public ImageView getImgMove() {

        return imgMove;

    }

    public void setImgMove(ImageView imgMove) {

        this.imgMove = imgMove;

    }

    public boolean isMmersion() {

        return isMmersion;

    }

    public void setMmersion(boolean mmersion) {

        isMmersion = mmersion;

    }

    public String getDescribe() {

        return describe;

    }

    public void setDescribe(String describe) {

        this.describe = describe;

    }

    public String getTitle() {

        return title;

    }

    public void setTitle(String title) {

        this.title = title;

    }

    public Drawable getImgFinishsrc() {

        return imgFinishsrc;

    }

    public void setImgFinishsrc(Drawable imgFinishsrc) {

        this.imgFinishsrc = imgFinishsrc;

    }

    public Drawable getImgMovesrc() {

        return imgMovesrc;

    }

    public void setImgMovesrc(Drawable imgMovesrc) {

        this.imgMovesrc = imgMovesrc;

    }

    public int getStyle() {

        return style;

    }

    public TitleBarView(Context context, @Nullable AttributeSet attrs) {

        super(context, attrs);

        initView(context);

        initAttributeSet(context, attrs);

    }

    public TitleBarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

        super(context, attrs, defStyleAttr);

        initView(context);

        initAttributeSet(context, attrs);

    }

    /**

    * 初始化自定义属性

    *

    * @param attrs

    */

    private void initAttributeSet(Context context, @Nullable AttributeSet attrs) {

        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TitleBarView);

        if (typedArray != null) {

            isMmersion = typedArray.getBoolean(R.styleable.TitleBarView_is_immersion, true);

            describe = typedArray.getString(R.styleable.TitleBarView_describe);

            title = typedArray.getString(R.styleable.TitleBarView_title);

            imgFinishsrc = typedArray.getDrawable(R.styleable.TitleBarView_img_finish_src);

            imgMovesrc = typedArray.getDrawable(R.styleable.TitleBarView_img_move_src);

            style = typedArray.getInteger(R.styleable.TitleBarView_titlebar_style, -1);

            if (style == -1) {

                style = STYLE_FINISH_TITLE_TEXT;

            }

        }

        //设置属性数据

        if (TextUtil.isEmpty(title)) {

            tvTitle.setText("我是标题");

        } else {

            tvTitle.setText(title);

        }

        if (TextUtil.isEmpty(describe)) {

            tvDescribe.setText("描述");

        } else {

            tvDescribe.setText(describe);

        }

        if (null == imgFinishsrc) {

            imgFinish.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.img_finish_white));

        } else {

            imgFinish.setImageDrawable(imgFinishsrc);

        }

        if (null == imgMovesrc) {

            imgMove.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.img_finish_white));

        } else {

            imgMove.setImageDrawable(imgMovesrc);

        }

        setStyle(style);

    }

    @Override

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        if (isMmersion)

            super.onMeasure(widthMeasureSpec, heightMeasureSpec + getStatusBarHeight(getContext()));

        else

            super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        measureChildren(widthMeasureSpec, heightMeasureSpec);

        int widthMode = MeasureSpec.getMode(widthMeasureSpec);

        int width = MeasureSpec.getSize(widthMeasureSpec);

        int heightMode = MeasureSpec.getMode(heightMeasureSpec);

        int height = MeasureSpec.getSize(heightMeasureSpec);

        if (widthMode == MeasureSpec.AT_MOST && heightMode == MeasureSpec.AT_MOST) {

            int groupWidth = getMaxWidth();

            int groupHeight = getTotalHeight();

            setMeasuredDimension(groupWidth, groupHeight);

        } else if (widthMode == MeasureSpec.AT_MOST) {

            setMeasuredDimension(getMaxWidth(), height);

        } else if (heightMode == MeasureSpec.AT_MOST) {

            setMeasuredDimension(width, getTotalHeight());

        }

    }

    private int getMaxWidth() {

        int count = getChildCount();

        int maxWidth = 0;

        for (int i = 0; i < count; i++) {

            int currentWidth = getChildAt(i).getMeasuredWidth();

            if (maxWidth < currentWidth) {

                maxWidth = currentWidth;

            }

        }

        return maxWidth;

    }

    private int getTotalHeight() {

        int count = getChildCount();

        int totalHeight = 0;

        for (int i = 0; i < count; i++) {

            totalHeight += getChildAt(i).getMeasuredHeight();

        }

        return totalHeight;

    }

    @Override

    protected void onLayout(boolean changed, int l, int t, int r, int b) {

        int count = getChildCount();

        for (int i = 0; i < count; i++) {

            View view = getChildAt(i);

            if (isMmersion) {

                view.layout(l, getStatusBarHeight(getContext()), r, b);

            } else {

                view.layout(l, t, r, b);

            }

        }

    }

    private void initView(Context context) {

        int dp15 = DensityUtil.dip2px(context, 15);

        rlTitleBar = new RelativeLayout(context);

        RelativeLayout.LayoutParams rlTitleBarParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

        rlTitleBarParams.addRule(ALIGN_PARENT_BOTTOM);

        rlTitleBar.setLayoutParams(rlTitleBarParams);

        rlTitleBar.setId(RL_TITLEBAR);

        tvTitle = new TextView(context);

        tvTitle.setId(TV_TITLE);

        imgFinish = new ImageView(context);

        imgFinish.setId(IMG_FINIGH);

        tvDescribe = new TextView(context);

        tvDescribe.setId(TV_DESCRIBE);

        imgMove = new ImageView(context);

        imgMove.setId(IMG_MOVE);

        //添加布局

        rlTitleBar.addView(tvTitle);

        rlTitleBar.addView(imgFinish);

        rlTitleBar.addView(tvDescribe);

        rlTitleBar.addView(imgMove);

        //-------------------------------------------设置标题文字信息-----------------------------------------

        LayoutParams tvTitlePramas = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

        tvTitle.setGravity(CENTER);

        tvTitle.setLayoutParams(tvTitlePramas);

        tvTitle.setText("我是标题");

        setTextColor(tvTitle, R.color.white);

        setTextSize(tvTitle, 20);

        //-------------------------------------------设置返回按钮位置等信息-----------------------------------------

        imgFinish.setScaleType(ImageView.ScaleType.CENTER);//设置图片为居中位置

        imgFinish.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.img_finish_white));

        int dp45 = DensityUtil.dip2px(context, 45);

        RelativeLayout.LayoutParams imgFinishLayoutParams = new RelativeLayout.LayoutParams(dp45, LayoutParams.MATCH_PARENT);

        imgFinish.setLayoutParams(imgFinishLayoutParams);

        //-----------------------------------------设置右侧文字内容------------------------------------------------

        RelativeLayout.LayoutParams tvDescribeParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

        tvDescribeParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);//设置位于最右边

        tvDescribeParams.addRule(RelativeLayout.CENTER_VERTICAL);//设置位于最右边

        tvDescribeParams.setMargins(0, 0, dp15, 0);//设置右外边距

        tvDescribe.setLayoutParams(tvDescribeParams);

        tvDescribe.setText("描述");

        setTextColor(tvDescribe, R.color.white);

        setTextSize(tvDescribe, 14);

        //----------------------------------------设置右侧图片位置--------------------------------------------

        RelativeLayout.LayoutParams imgMoveParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

        imgMoveParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);//设置位于最右边

        imgMoveParams.addRule(RelativeLayout.CENTER_VERTICAL);//设置位于最右边

        imgMoveParams.setMargins(0, 0, dp15, 0);//设置右外边距

        imgMove.setScaleType(ImageView.ScaleType.CENTER);

        imgMove.setLayoutParams(imgMoveParams);

        //设置整体

        addView(rlTitleBar);

        initViewClick();

    }

    private void initViewClick() {

        imgFinish.setOnClickListener(v -> {

            if (onFinishClick != null)

                onFinishClick.onFinishClick(v);

        });

        imgMove.setOnClickListener(v -> {

            if (onMoveClick != null)

                onMoveClick.onMoveClick(v);

        });

        tvDescribe.setOnClickListener(v -> {

            if (onDescribeClick != null)

                onDescribeClick.onDescribeClick(v);

        });

    }

    /**

    * 设置标题栏风格

    *

    * @param style

    */

    public void setStyle(int style) {

        switch (style) {

            case STYLE_FINISH_TITLE_TEXT_MOVE:

            case STYLE_FINISH_TITLE_MOVE_TEXT:

                imgMove.setVisibility(VISIBLE);

                imgFinish.setVisibility(VISIBLE);

                tvDescribe.setVisibility(VISIBLE);

                tvTitle.setVisibility(VISIBLE);

                break;

            case STYLE_FINISH_TITLE_MOVE:

                imgMove.setVisibility(VISIBLE);

                imgFinish.setVisibility(VISIBLE);

                tvDescribe.setVisibility(GONE);

                tvTitle.setVisibility(VISIBLE);

                break;

            case STYLE_FINISH_TITLE_TEXT:

                imgMove.setVisibility(GONE);

                imgFinish.setVisibility(VISIBLE);

                tvDescribe.setVisibility(VISIBLE);

                tvTitle.setVisibility(VISIBLE);

                break;

            case STYLE_TITLE:

                imgMove.setVisibility(GONE);

                imgFinish.setVisibility(GONE);

                tvDescribe.setVisibility(GONE);

                tvTitle.setVisibility(VISIBLE);

                break;

            case STYLE_FINISH_TITLE:

                imgMove.setVisibility(GONE);

                imgFinish.setVisibility(VISIBLE);

                tvDescribe.setVisibility(GONE);

                tvTitle.setVisibility(VISIBLE);

                break;

        }

        int dp15 = DensityUtil.dip2px(getContext(), 15);

        switch (style) {

            case STYLE_FINISH_TITLE_MOVE_TEXT: {

                RelativeLayout.LayoutParams imgMoveParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

                imgMoveParams.addRule(RelativeLayout.CENTER_VERTICAL);

                imgMoveParams.addRule(RelativeLayout.LEFT_OF, tvDescribe.getId());

                imgMoveParams.setMargins(0, 0, dp15, 0);//设置右外边距

                imgMove.setLayoutParams(imgMoveParams);

            }

            break;

            case STYLE_FINISH_TITLE_TEXT_MOVE: {

                RelativeLayout.LayoutParams tvDescribeParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

                tvDescribeParams.addRule(RelativeLayout.LEFT_OF, imgMove.getId());//设置位于最右边

                tvDescribeParams.addRule(RelativeLayout.CENTER_VERTICAL);//设置位于最右边

                tvDescribeParams.setMargins(0, 0, dp15, 0);//设置右外边距

                tvDescribe.setLayoutParams(tvDescribeParams);

            }

            break;

        }

    }

    /**

    * 获取状态栏高度

    *

    * @param context

    * @return

    */

    private 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 void setTextColor(TextView textView, @ColorRes int color) {

        textView.setTextColor(getResources().getColor(color));

    }

    public void setTextSize(TextView textView, float size) {

        textView.setTextSize(size);

    }

    /**

    * 设置标题

    *

    * @param title

    */

    public void setTitleText(String title) {

        tvTitle.setText(title);

    }

    public String getTitleText() {

        return tvTitle.getText().toString();

    }

    /**

    * 设置描述

    *

    * @param describe

    */

    public void setDescribeText(String describe) {

        tvDescribe.setText(describe);

    }

    public String getDescribeText() {

        return tvDescribe.getText().toString();

    }

    public interface OnFinishClick {

        void onFinishClick(View img);

    }

    public interface OnMoveClick {

        void onMoveClick(View img);

    }

    public interface OnDescribeClick {

        void onDescribeClick(View view);

    }

}

以上就是标题栏的全部代码,当然也有自定义属性如下:

<declare-styleable name="TitleBarView">

    <attr name="is_immersion" format="boolean" />

    <attr name="title" format="string" />

    <attr name="describe" format="string" />

    <attr name="img_move_src" format="reference" />

    <attr name="img_finish_src" format="reference" />

    <attr name="titlebar_style" format="integer">

        <enum name="finish_title" value="0" />

        <enum name="finish_title_text" value="1" />

        <enum name="finish_title_move" value="2" />

        <enum name="finish_title_text_move" value="3" />

        <enum name="finish_title_move_text" value="4" />

        <enum name="title" value="5" />

    </attr>

</declare-styleable>

当然是用起来也是相当简单的:

<driver.daijia.com.driver.view.TitleBarView

    android:layout_width="match_parent"

    android:layout_height="?attr/actionBarSize"

    app:img_finish_src="@mipmap/img_finish_white"

    app:img_move_src="@mipmap/img_finish_white"

    app:title="注册"

    app:titlebar_style="finish_title_move_text" />

还有很多功能不一一演示了。


分享出来,希望能帮助很多同事,减少一部分工期时间,如果有漏洞或是性能问题,请与我联系,谢谢。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容