Android TitleBar标题栏

Android TitleBar标题栏

概述

在这里插入图片描述

源码

定义属性:

<declare-styleable name="TitleBar">
    <!--整体区域:-->
    <attr name="verticalPadding" format="dimension" />

    <!--中间区域:-->
    <!--标题-->
    <attr name="title" format="string" />
    <!--标题颜色-->
    <attr name="titleColor" format="color" />
    <!--标题大小-->
    <attr name="titleSize" format="dimension" />
    <!--标题位置-->
    <attr name="titlePosition">
        <enum name="left" value="1" />
        <enum name="right" value="2" />
        <enum name="center" value="3" />
    </attr>
    <!--标题样式-->
    <attr name="titleStyle">
        <enum name="normal" value="1" />
        <enum name="bold" value="2" />
        <enum name="italic" value="3" />
    </attr>
    <!--标题图标-->
    <attr name="titleIcon" format="reference" />
    <!--标题图标大小-->
    <attr name="titleIconSize" format="dimension" />
    <!--标题图标距离文字距离-->
    <attr name="titleIconPadding" format="dimension" />
    <!--标题图标位置-->
    <attr name="titleIconPosition">
        <enum name="left" value="1" />
        <enum name="right" value="2" />
        <enum name="top" value="3" />
        <enum name="bottom" value="4" />
    </attr>
    <!--标题水平间距-->
    <attr name="titleHorizontalPadding" format="dimension" />
    <!--标题文字溢出模式-->
    <attr name="titleOverflowMode">
        <enum name="none" value="0" />
        <enum name="start" value="1" />
        <enum name="middle" value="2" />
        <enum name="end" value="3" />
        <enum name="marquee" value="4" />
    </attr>

    <!--左边区域:-->
    <!--左边标题-->
    <attr name="leftText" format="string" />
    <!--左边标题颜色-->
    <attr name="leftTextColor" format="color|reference" />
    <!--左边标题大小-->
    <attr name="leftTextSize" format="dimension" />
    <!--左边标题样式-->
    <attr name="leftTextStyle">
        <enum name="normal" value="1" />
        <enum name="bold" value="2" />
        <enum name="italic" value="3" />
    </attr>
    <!--左边图标-->
    <attr name="leftIcon" format="reference" />
    <!--左边图标大小-->
    <attr name="leftIconSize" format="dimension" />
    <!--左边图标距离文字-->
    <attr name="leftIconPadding" format="dimension" />
    <!--左边图标位置-->
    <attr name="leftIconPosition">
        <enum name="left" value="1" />
        <enum name="right" value="2" />
        <enum name="top" value="3" />
        <enum name="bottom" value="4" />
    </attr>
    <!--左边水平间距-->
    <attr name="leftHorizontalPadding" format="dimension" />

    <!--右边区域:-->
    <!--右边标题-->
    <attr name="rightText" format="string" />
    <!--右边标题颜色-->
    <attr name="rightTextColor" format="color|reference" />
    <!--右边标题大小-->
    <attr name="rightTextSize" format="dimension" />
    <!--右边标题样式-->
    <attr name="rightTextStyle">
        <enum name="normal" value="1" />
        <enum name="bold" value="2" />
        <enum name="italic" value="3" />
    </attr>
    <!--右边图标-->
    <attr name="rightIcon" format="reference" />
    <!--右边图标大小-->
    <attr name="rightIconSize" format="dimension" />
    <!--右边图标距离文字-->
    <attr name="rightIconPadding" format="dimension" />
    <!--右边图标位置-->
    <attr name="rightIconPosition">
        <enum name="left" value="1" />
        <enum name="right" value="2" />
        <enum name="top" value="3" />
        <enum name="bottom" value="4" />
    </attr>
    <!--右边水平间距-->
    <attr name="rightHorizontalPadding" format="dimension" />

    <!--下划线区域:-->
    <!--下划线是否可见-->
    <attr name="lineVisible" format="boolean" />
    <!--下划线颜色-->
    <attr name="lineColor" format="color|reference" />
    <!--下划线尺寸-->
    <attr name="lineSize" format="dimension" />
</declare-styleable>

定义创建类:

object TitleBarFactory {

    /**
     * 创建中间的标题
     */
    fun newTitleView(context: Context): TextView {
        return TextView(context).apply {
            gravity = Gravity.CENTER_VERTICAL
            isFocusable = true
            setSingleLine()
            layoutParams = FrameLayout.LayoutParams(
                FrameLayout.LayoutParams.WRAP_CONTENT,
                FrameLayout.LayoutParams.MATCH_PARENT,
                Gravity.CENTER
            )
        }
    }

    /**
     * 创建左边
     */
    fun newLeftView(context: Context): TextView {
        return TextView(context).apply {
            gravity = Gravity.CENTER_VERTICAL
            isFocusable = true
            setSingleLine()
            layoutParams = FrameLayout.LayoutParams(
                FrameLayout.LayoutParams.WRAP_CONTENT,
                FrameLayout.LayoutParams.MATCH_PARENT,
                Gravity.START or Gravity.CENTER_VERTICAL
            )
        }
    }

    /**
     * 创建右边
     */
    fun newRightView(context: Context): TextView {
        return TextView(context).apply {
            gravity = Gravity.CENTER_VERTICAL
            isFocusable = true
            setSingleLine()
            layoutParams = FrameLayout.LayoutParams(
                FrameLayout.LayoutParams.WRAP_CONTENT,
                FrameLayout.LayoutParams.MATCH_PARENT,
                Gravity.END or Gravity.CENTER_VERTICAL
            )
        }
    }

    /**
     * 创建下划线
     */
    fun newLine(context: Context): View {
        return View(context).apply {
            val lp = FrameLayout.LayoutParams(
                FrameLayout.LayoutParams.MATCH_PARENT,
                1,
                Gravity.BOTTOM
            )
            layoutParams = lp
        }
    }
}

定义TitleBar:

class TitleBar @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {

    companion object {
        const val NONE_RES = -1

        val DEFAULT_VERTICAL_PADDING = dp2px(15)

        const val DEFAULT_TITLE_POSITION = 3
        const val DEFAULT_TITLE = ""
        const val DEFAULT_TITLE_COLOR = 0xFF222222.toInt()
        val DEFAULT_TITLE_SIZE = sp2px(16)
        const val DEFAULT_TITLE_STYLE = 1
        const val DEFAULT_TITLE_ICON_SIZE = 0
        const val DEFAULT_TITLE_ICON_PADDING = 0
        const val DEFAULT_TITLE_ICON_POSITION = 1
        const val DEFAULT_TITLE_HORIZONTAL_PADDING = 0
        const val DEFAULT_TITLE_OVERFLOW_MODE = 0

        const val DEFAULT_LEFT_TITLE = ""
        const val DEFAULT_LEFT_TITLE_COLOR = 0xFF666666.toInt()
        val DEFAULT_LEFT_TITLE_SIZE = sp2px(14)
        const val DEFAULT_LEFT_TITLE_STYLE = 1
        const val DEFAULT_LEFT_ICON_SIZE = 0
        const val DEFAULT_LEFT_ICON_PADDING = 0
        const val DEFAULT_LEFT_ICON_POSITION = 1
        val DEFAULT_LEFT_HORIZONTAL_PADDING = dp2px(10)

        const val DEFAULT_RIGHT_TITLE = ""
        const val DEFAULT_RIGHT_TITLE_COLOR = 0xFF666666.toInt()
        val DEFAULT_RIGHT_TITLE_SIZE = sp2px(14)
        const val DEFAULT_RIGHT_TITLE_STYLE = 1
        const val DEFAULT_RIGHT_ICON_SIZE = 0
        const val DEFAULT_RIGHT_ICON_PADDING = 0
        const val DEFAULT_RIGHT_ICON_POSITION = 1
        val DEFAULT_RIGHT_HORIZONTAL_PADDING = dp2px(10)

        const val DEFAULT_LINE_VISIBLE = true
        const val DEFAULT_LINE_COLOR = 0xFFECECEC.toInt()
        const val DEFAULT_LINE_SIZE = 1
    }

    // 中间TextView
    private val mTitleTextView by lazy { TitleBarFactory.newTitleView(context) }

    // 左边TextView
    private val mLeftTextView by lazy { TitleBarFactory.newLeftView(context) }

    // 右边TextView
    private val mRightTextView by lazy { TitleBarFactory.newRightView(context) }

    // 下划线
    private val mLineView by lazy { TitleBarFactory.newLine(context) }

    init {
        val a: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.TitleBar)
        val verticalPadding =
            a.getDimensionPixelSize(R.styleable.TitleBar_verticalPadding, DEFAULT_VERTICAL_PADDING)

        setupTitleView(a, verticalPadding)
        setupLeftView(a, verticalPadding)
        setupRightView(a, verticalPadding)
        setupLineView(a)
        a.recycle()

        addView(mTitleTextView, 0)
        addView(mLeftTextView, 1)
        addView(mRightTextView, 2)
        addView(mLineView, 3)
    }

    /**
     * 设置中间标题区域
     */
    private fun setupTitleView(a: TypedArray, verticalPadding: Int) {
        // 设置标题文字
        val title = a.getString(R.styleable.TitleBar_title) ?: DEFAULT_TITLE
        setTitle(title)
        // 设置标题文字颜色
        val titleColor = a.getColor(R.styleable.TitleBar_titleColor, DEFAULT_TITLE_COLOR)
        mTitleTextView.setTextColor(titleColor)
        // 设置标题文字大小
        val titleSize = a.getDimensionPixelSize(R.styleable.TitleBar_titleSize, DEFAULT_TITLE_SIZE)
        mTitleTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleSize.toFloat())
        // 设置标题样式
        val titleStyle = a.getInt(R.styleable.TitleBar_titleStyle, DEFAULT_TITLE_STYLE)
        val titleTypeFace: Typeface = when (titleStyle) {
            2 -> Typeface.DEFAULT_BOLD
            3 -> Typeface.MONOSPACE
            else -> Typeface.DEFAULT
        }
        mTitleTextView.typeface = titleTypeFace
        // 设置标题文字位置
        val titlePosition = a.getInt(R.styleable.TitleBar_titlePosition, DEFAULT_TITLE_POSITION)
        val lp = mTitleTextView.layoutParams as FrameLayout.LayoutParams
        lp.gravity = when (titlePosition) {
            1 -> Gravity.LEFT
            2 -> Gravity.RIGHT
            3 -> Gravity.CENTER
            else -> Gravity.NO_GRAVITY
        }
        mTitleTextView.layoutParams = lp
        // 设置标题图标
        if (a.hasValue(R.styleable.TitleBar_titleIcon)) {
            val titleIconRes = a.getResourceId(R.styleable.TitleBar_titleIcon, -1)
            val titleDrawable = ContextCompat.getDrawable(context, titleIconRes)
            val titleIconSize =
                a.getDimensionPixelSize(R.styleable.TitleBar_titleIconSize, DEFAULT_TITLE_ICON_SIZE)
            val titleIconPadding = a.getDimensionPixelSize(
                R.styleable.TitleBar_titleIconPadding, DEFAULT_TITLE_ICON_PADDING
            )
            val titleIconPosition =
                a.getInt(R.styleable.TitleBar_titleIconPosition, DEFAULT_TITLE_ICON_POSITION)
            if (titleDrawable != null) {
                // 设置图标大小
                if (titleIconSize > 0) {
                    titleDrawable.setBounds(0, 0, titleIconSize, titleIconSize)
                } else {
                    titleDrawable.setBounds(
                        0,
                        0,
                        titleDrawable.intrinsicWidth,
                        titleDrawable.intrinsicHeight
                    )
                }
                // 设置图标距离文字
                mTitleTextView.compoundDrawablePadding = titleIconPadding
                // 设置图标位置
                when (titleIconPosition) {
                    1 -> mTitleTextView.setCompoundDrawables(titleDrawable, null, null, null)
                    2 -> mTitleTextView.setCompoundDrawables(null, null, titleDrawable, null)
                    3 -> mTitleTextView.setCompoundDrawables(null, titleDrawable, null, null)
                    4 -> mTitleTextView.setCompoundDrawables(null, null, null, titleDrawable)
                }
            }
        }
        // 设置标题的水平间距
        val titleHorizontalPadding = a.getDimensionPixelSize(
            R.styleable.TitleBar_titleHorizontalPadding, DEFAULT_TITLE_HORIZONTAL_PADDING
        )
        // 设置标题边距
        mTitleTextView.setPadding(
            titleHorizontalPadding,
            verticalPadding,
            titleHorizontalPadding,
            verticalPadding
        )
        // 设置标题文字溢出模式
        val titleOverflowMode =
            a.getInt(R.styleable.TitleBar_titleOverflowMode, DEFAULT_TITLE_OVERFLOW_MODE)
        mTitleTextView.ellipsize = when (titleOverflowMode) {
            1 -> TextUtils.TruncateAt.START
            2 -> TextUtils.TruncateAt.MIDDLE
            3 -> TextUtils.TruncateAt.END
            4 -> {
                // 设置跑马灯之后需要设置选中才能有效果
                mTitleTextView.isSelected = true
                // 设置跑马灯需要先获取焦点
                mTitleTextView.isFocusable = true
                // 设置跑马灯的循环次数
                mTitleTextView.marqueeRepeatLimit = -1
                TextUtils.TruncateAt.MARQUEE
            }
            else -> null
        }
        // 设置跑马灯的循环次数
        mTitleTextView.marqueeRepeatLimit = -1
    }

    /**
     * 设置左边区域
     */
    private fun setupLeftView(a: TypedArray, verticalPadding: Int) {
        // 设置左边标题
        val leftText = a.getString(R.styleable.TitleBar_leftText) ?: DEFAULT_LEFT_TITLE
        setLeftText(leftText)
        // 设置左边标题颜色
        val leftTitleColor =
            a.getColor(R.styleable.TitleBar_leftTextColor, DEFAULT_LEFT_TITLE_COLOR)
        mLeftTextView.setTextColor(leftTitleColor)
        // 设置左边标题大小
        val leftTitleSize =
            a.getDimensionPixelSize(R.styleable.TitleBar_leftTextSize, DEFAULT_LEFT_TITLE_SIZE)
        mLeftTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, leftTitleSize.toFloat())
        // 设置左边标题样式
        val leftTitleStyle = a.getInt(R.styleable.TitleBar_leftTextStyle, DEFAULT_LEFT_TITLE_STYLE)
        val leftTitleTypeFace: Typeface = when (leftTitleStyle) {
            2 -> Typeface.DEFAULT_BOLD
            3 -> Typeface.MONOSPACE
            else -> Typeface.DEFAULT
        }
        mLeftTextView.typeface = leftTitleTypeFace
        // 设置左边图标
        if (a.hasValue(R.styleable.TitleBar_leftIcon)) {
            val leftIconRes = a.getResourceId(R.styleable.TitleBar_leftIcon, NONE_RES)
            val leftDrawable = ContextCompat.getDrawable(context, leftIconRes)
            val leftIconSize =
                a.getDimensionPixelSize(R.styleable.TitleBar_leftIconSize, DEFAULT_LEFT_ICON_SIZE)
            val leftIconPadding = a.getDimensionPixelSize(
                R.styleable.TitleBar_leftIconPadding, DEFAULT_LEFT_ICON_PADDING
            )
            val leftIconPosition =
                a.getInt(R.styleable.TitleBar_leftIconPosition, DEFAULT_LEFT_ICON_POSITION)
            if (leftDrawable != null) {
                // 设置图标大小
                if (leftIconSize > 0) {
                    leftDrawable.setBounds(0, 0, leftIconSize, leftIconSize)
                } else {
                    leftDrawable.setBounds(
                        0,
                        0,
                        leftDrawable.intrinsicWidth,
                        leftDrawable.intrinsicHeight
                    )
                }
                // 设置图标距离文字
                mLeftTextView.compoundDrawablePadding = leftIconPadding
                // 设置图标位置
                when (leftIconPosition) {
                    1 -> mLeftTextView.setCompoundDrawables(leftDrawable, null, null, null)
                    2 -> mLeftTextView.setCompoundDrawables(null, null, leftDrawable, null)
                    3 -> mLeftTextView.setCompoundDrawables(null, leftDrawable, null, null)
                    4 -> mLeftTextView.setCompoundDrawables(null, null, null, leftDrawable)
                }
            }
        }
        // 设置左边的水平间距
        val leftHorizontalPadding = a.getDimensionPixelSize(
            R.styleable.TitleBar_leftHorizontalPadding, DEFAULT_LEFT_HORIZONTAL_PADDING
        )
        mLeftTextView.setPadding(
            leftHorizontalPadding,
            verticalPadding,
            leftHorizontalPadding,
            verticalPadding
        )
    }

    /**
     * 设置右边区域
     */
    private fun setupRightView(a: TypedArray, verticalPadding: Int) {
        // 设置右边标题
        val rightText = a.getString(R.styleable.TitleBar_rightText) ?: DEFAULT_RIGHT_TITLE
        setRightText(rightText)
        // 设置右边标题颜色
        val rightTitleColor =
            a.getColor(R.styleable.TitleBar_rightTextColor, DEFAULT_RIGHT_TITLE_COLOR)
        mRightTextView.setTextColor(rightTitleColor)
        // 设置右边标题大小
        val rightTitleSize =
            a.getDimensionPixelSize(R.styleable.TitleBar_rightTextSize, DEFAULT_RIGHT_TITLE_SIZE)
        mRightTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, rightTitleSize.toFloat())
        // 设置右边标题样式
        val rightTitleStyle =
            a.getInt(R.styleable.TitleBar_rightTextStyle, DEFAULT_RIGHT_TITLE_STYLE)
        val rightTitleTypeFace: Typeface = when (rightTitleStyle) {
            2 -> Typeface.DEFAULT_BOLD
            3 -> Typeface.MONOSPACE
            else -> Typeface.DEFAULT
        }
        mRightTextView.typeface = rightTitleTypeFace
        // 设置右边图标
        if (a.hasValue(R.styleable.TitleBar_rightIcon)) {
            val rightIconRes = a.getResourceId(R.styleable.TitleBar_rightIcon, NONE_RES)
            val rightDrawable = ContextCompat.getDrawable(context, rightIconRes)
            val rightIconSize =
                a.getDimensionPixelSize(R.styleable.TitleBar_rightIconSize, DEFAULT_RIGHT_ICON_SIZE)
            val rightIconPadding = a.getDimensionPixelSize(
                R.styleable.TitleBar_rightIconPadding, DEFAULT_RIGHT_ICON_PADDING
            )
            val rightIconPosition =
                a.getInt(R.styleable.TitleBar_rightIconPosition, DEFAULT_RIGHT_ICON_POSITION)
            if (rightDrawable != null) {
                // 设置图标大小
                if (rightIconSize > 0) {
                    rightDrawable.setBounds(0, 0, rightIconSize, rightIconSize)
                } else {
                    rightDrawable.setBounds(
                        0,
                        0,
                        rightDrawable.intrinsicWidth,
                        rightDrawable.intrinsicHeight
                    )
                }
                // 设置图标距离文字
                mRightTextView.compoundDrawablePadding = rightIconPadding
                // 设置图标位置
                when (rightIconPosition) {
                    1 -> mRightTextView.setCompoundDrawables(rightDrawable, null, null, null)
                    2 -> mRightTextView.setCompoundDrawables(null, null, rightDrawable, null)
                    3 -> mRightTextView.setCompoundDrawables(null, rightDrawable, null, null)
                    4 -> mRightTextView.setCompoundDrawables(null, null, null, rightDrawable)
                }
            }
        }
        // 设置右边的水平间距
        val rightHorizontalPadding = a.getDimensionPixelSize(
            R.styleable.TitleBar_rightHorizontalPadding, DEFAULT_RIGHT_HORIZONTAL_PADDING
        )
        mRightTextView.setPadding(
            rightHorizontalPadding,
            verticalPadding,
            rightHorizontalPadding,
            verticalPadding
        )
    }

    /**
     * 设置下划线
     */
    private fun setupLineView(a: TypedArray) {
        // 设置下划线可见
        val lineVisible = a.getBoolean(R.styleable.TitleBar_lineVisible, DEFAULT_LINE_VISIBLE)
        mLineView.visibility = if (lineVisible) View.VISIBLE else View.GONE
        // 设置下划线颜色
        mLineView.background =
            if (a.hasValue(R.styleable.TitleBar_lineColor)) {
                a.getDrawable(R.styleable.TitleBar_lineColor)
            } else {
                ColorDrawable(DEFAULT_LINE_COLOR)
            }
        // 设置下划线尺寸
        val lineSize = a.getDimensionPixelSize(R.styleable.TitleBar_lineSize, DEFAULT_LINE_SIZE)
        mLineView.apply {
            val lp = layoutParams.apply {
                height = lineSize
            }
            layoutParams = lp
        }
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        Log.e("TAG", "onMeasure")
        val titleBarMeasuredWidth = measuredWidth
        val titleBarMeasuredHeight = measuredHeight
        val titleViewMeasuredWidth = mTitleTextView.measuredWidth
        val titleViewMeasuredHeight = mTitleTextView.measuredHeight
        val leftViewMeasuredWidth = mLeftTextView.measuredWidth
        val leftViewMeasuredHeight = mLeftTextView.measuredHeight
        val rightViewMeasuredWidth = mRightTextView.measuredWidth
        val rightViewMeasuredHeight = mRightTextView.measuredHeight
        val maxEdgeWidth = Math.max(leftViewMeasuredWidth, rightViewMeasuredWidth)
        val totalWidth = titleViewMeasuredWidth + maxEdgeWidth * 2

        if (totalWidth <= titleBarMeasuredWidth) {
            // 测量的总宽度小于标题栏宽度
            measureTitleBar(
                if (isContainView(mLeftTextView)) leftViewMeasuredWidth else 0,
                titleViewMeasuredWidth,
                if (isContainView(mRightTextView)) rightViewMeasuredWidth else 0,
                heightMeasureSpec
            )
        } else {
            // 测量的总宽度大于标题栏宽度
            var leftViewWidth = 0
            var rightViewWidth = 0
            var titleViewWidth = 0
            if (maxEdgeWidth > titleBarMeasuredWidth / 3) {
                // 左右项太长
                leftViewWidth = titleBarMeasuredWidth / 4 // 左右项各占25%
                rightViewWidth = leftViewWidth
                titleViewWidth = titleBarMeasuredWidth / 2 // 中间标题占50%
            } else {
                // 中间标题太长
                leftViewWidth = maxEdgeWidth // 左右项占maxEdgeWidth
                rightViewWidth = leftViewWidth
                titleViewWidth = titleBarMeasuredWidth - maxEdgeWidth * 2 // 中间标题占剩余空间
            }
            measureTitleBar(
                if (isContainView(mLeftTextView)) leftViewWidth else 0,
                titleViewWidth,
                if (isContainView(mRightTextView)) rightViewWidth else 0,
                heightMeasureSpec
            )
        }
    }

    /**
     * 测量
     */
    private fun measureTitleBar(
        leftViewWidth: Int,
        titleViewWidth: Int,
        rightViewWidth: Int,
        titleBarHeightMeasureSpec: Int
    ) {
        val leftWidthMeasureSpec = MeasureSpec.makeMeasureSpec(leftViewWidth, MeasureSpec.EXACTLY)
        val titleWidthMeasureSpec = MeasureSpec.makeMeasureSpec(titleViewWidth, MeasureSpec.EXACTLY)
        val rightWidthMeasureSpec = MeasureSpec.makeMeasureSpec(rightViewWidth, MeasureSpec.EXACTLY)
        measureChildWithMargins(
            mLeftTextView,
            leftWidthMeasureSpec, 0,
            titleBarHeightMeasureSpec, 0
        )
        measureChildWithMargins(
            mTitleTextView,
            titleWidthMeasureSpec, 0,
            titleBarHeightMeasureSpec, 0
        )
        measureChildWithMargins(
            mRightTextView,
            rightWidthMeasureSpec, 0,
            titleBarHeightMeasureSpec, 0
        )
    }

    /**
     * 判断TextView是否存在内容
     * 返回true,表示存在;
     * 返回false,表示不存在。
     */
    private fun isContainView(textView: TextView): Boolean {
        val text = textView.text
        if (!TextUtils.isEmpty(text)) {
            return true
        }
        val drawables = textView.compoundDrawables
        for (d in drawables) {
            if (d != null) {
                return true
            }
        }
        return false
    }

    override fun setLayoutParams(params: ViewGroup.LayoutParams) {
        Log.e("TAG", "setLayoutParams")
        if (params.width == ViewGroup.LayoutParams.WRAP_CONTENT) {
            params.width = ViewGroup.LayoutParams.MATCH_PARENT
        }
        if (params.height > 0) {
            mTitleTextView.setPadding(mTitleTextView.paddingLeft, 0, mTitleTextView.paddingRight, 0)
            mLeftTextView.setPadding(mTitleTextView.paddingLeft, 0, mTitleTextView.paddingRight, 0)
            mRightTextView.setPadding(mTitleTextView.paddingLeft, 0, mTitleTextView.paddingRight, 0)
        }
        super.setLayoutParams(params)
    }

    /**
     * 获取左边视图
     */
    fun getLeftView(): TextView {
        return mLeftTextView
    }

    /**
     * 获取右边视图
     */
    fun getRightView(): TextView {
        return mRightTextView
    }

    /**
     * 获取标题视图
     */
    fun getTitleView(): TextView {
        return mTitleTextView
    }

    /**
     * 设置左边点击事件
     */
    fun setOnLeftClickListener(listener: OnClickListener): TitleBar {
        mLeftTextView.setOnClickListener(listener)
        return this
    }

    /**
     * 设置右边点击事件
     */
    fun setOnTitleClickListener(listener: OnClickListener): TitleBar {
        mTitleTextView.setOnClickListener(listener)
        return this
    }

    /**
     * 设置标题点击事件
     */
    fun setOnRightClickListener(listener: OnClickListener): TitleBar {
        mRightTextView.setOnClickListener(listener)
        return this
    }

    /**
     * 设置标题
     */
    fun setTitle(title: String): TitleBar {
        mTitleTextView.text = title
        return this
    }

    /**
     * 设置左边文本
     */
    fun setLeftText(leftText: String): TitleBar {
        mLeftTextView.text = leftText
        return this
    }

    /**
     * 设置右边文本
     */
    fun setRightText(rightText: String): TitleBar {
        mRightTextView.text = rightText
        return this
    }
}

使用

方式一:

在这里插入图片描述

<com.example.tools.titlebar.widgets.TitleBar
    android:id="@+id/titleBar1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#fff"
    app:leftIcon="@drawable/ic_arrows_left"
    app:leftText="返回"
    app:rightIcon="@drawable/ic_delete"
    app:rightIconPosition="right"
    app:rightText="删除"
    app:title="标题"
    app:titleIcon="@drawable/pear_pic" />
titleBar1.setOnLeftClickListener {
    ToastUtils.show("左边")
}.setOnTitleClickListener {
    ToastUtils.show("标题")
}.setOnRightClickListener {
    ToastUtils.show("右边")
}

方式二:

在这里插入图片描述

<com.example.tools.titlebar.widgets.TitleBar
    android:id="@+id/titleBar2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:background="#fff"
    app:leftIcon="@drawable/ic_arrows_left"
    app:leftText="返回"
    app:lineColor="#f00"
    app:lineSize="1dp"
    app:rightIcon="@drawable/ic_delete"
    app:rightIconPosition="right"
    app:rightText="删除"
    app:title="标题ASDFASDFASDFASDASDFASDFASFASDFASDFASDFASDASFASDFASDFFASDFASD"
    app:titleIcon="@drawable/pear_pic"
    app:titleOverflowMode="marquee" />
titleBar2.setOnLeftClickListener {
    titleBar2.setLeftText("修改左边")
}.setOnTitleClickListener {
    titleBar2.setTitle("修改标题")
}.setOnRightClickListener {
    titleBar2.setRightText("修改右边")
}

方式三:

在这里插入图片描述

<com.example.tools.titlebar.widgets.TitleBar
    android:id="@+id/titleBar3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:background="#fff"
    app:title="hello world">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|center_vertical"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:paddingRight="10dp">

        <TextView
            android:id="@+id/info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="info" />

        <TextView
            android:id="@+id/details"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:text="details" />
    </LinearLayout>
</com.example.tools.titlebar.widgets.TitleBar>
info.setOnClickListener { ToastUtils.show("信息") }
details.setOnClickListener { ToastUtils.show("详情") }

源码下载

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值