Android自定义工具栏(三)——FreeToolbar

接上篇,要想更自由灵活的配置工具栏,还是得自己定制一个,暂时取名为FreeToolbar

效果图跟之前是一样的:


FreeToolbar有两种用法,一种是把FreeToolbarPopupMenu作为组件在你的代码里直接引用,还有一种更省事的方法是继承封装好的ToolbarActivity,这里只介绍后一种。

使用方法分为下面4步:

Step 1:把下面这些文件拷进你的工程:

  •     widget/目录下的源文件
  •     drawable/目录下的图片资源(可以替换成你自己的图片)
  •     res/layout/toolbar.xml
  •     res/values/attrs.xml
  •     res/values/dimens.xml

Step 2: 将你自己的activity继承FreeToolbarActivity

Step 3: 覆盖onCreateFreeToolbar()方法,配置一下工具栏的layout。之后就可以通过getFreeToolbar()进行一些其他的初始化操作了。

    @Override
    protected void onCreateFreeToolbar(ViewGroup root) {
        getLayoutInflater().inflate(R.layout.toolbar, root);
        super.onCreateFreeToolbar(root);
        // put other initialization here... e.g.:
        getFreeToolbar().setTitle("Hit me");
    }

Step 4: 如果你的工具栏需要overflow菜单,还需要覆盖onCreateOverflowMenu()方法,配置一下菜单的layout

    @Override
    protected boolean onCreateOverflowMenu(View menuLayout) {
        View layout = getLayoutInflater().inflate(R.layout.toolbar_menu, null);
        return super.onCreateOverflowMenu(layout);
    }

用起来是不是还挺简单的?那么FreeToolbar有哪些属性可以配置呢?可以参见attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="FreeToolbar">
        <attr name="menu_offset_x" format="dimension" />
        <attr name="menu_offset_y" format="dimension" />
        <attr name="menu_width" format="dimension" />
        <attr name="menu_height" format="dimension" />
        <attr name="title_padding_when_no_navi_icon" format="dimension" />
    </declare-styleable>
</resources>

一共有5个属性,可以在res/layout/toolbar.xml里进行配置:

  • menu_offset_x: 菜单相对于菜单按钮(那三个点)的水平偏移,注意原点是菜单按钮的左下角
  • menu_offset_y: 菜单相对于菜单按钮(那三个点)的垂直偏移,注意原点是菜单按钮的左下角
  • menu_width: 菜单的宽度
  • menu_height: 菜单的高度
  • title_padding_when_no_navi_icon: 当左边没有回退按钮时,标题相对于左边缘的偏移(默认是16dp

前面提到了可以用getFreeToolbar()获取FreeToolbar对象,然后进行一些配置。具体配置的API列表如下:

  • void setTitle(String title):设置标题文字
  • String getTitle():获取标题文字
  • void setNavigationEnabled(boolean enabled):启用导航按钮(也就是回退按钮)
  • void setOverflowMenuEnabled(boolean enabled):启用溢出菜单
  • void setTitleOnClickListener(View.OnClickListener listener):设置标题点击监听器
  • void setNavigationOnClickListener(View.OnClickListener listener):设置导航按钮点击监听器
  • float getOverflowMenuWidth():获取溢出菜单宽度
  • void setOverflowMenuWidth(float overflowMenuWidth):设置溢出菜单宽度
  • float getOverflowMenuHeight():获取溢出菜单高度
  • void setOverflowMenuHeight(float overflowMenuHeight):设置溢出菜单高度
  • float getOverflowMenuOffsetX():获取溢出菜单水平偏移
  • void setOverflowMenuOffsetX(float overflowMenuOffsetX):设置溢出菜单水平偏移
  • float getOverflowMenuOffsetY():获取溢出菜单垂直偏移
  • void setOverflowMenuOffsetY(float overflowMenuOffsetY):设置溢出菜单垂直偏移
  • float getTitlePaddingWhenNoNaviIcon():获取无导航按钮时标题左边的偏移
  • void setTitlePaddingWhenNoNaviIcon(float titlePaddingWhenNoNaviIcon):设置无导航按钮时标题左边的偏移

具体实现代码很简单,主要就是三部分:

1. PopupMenu:继承自PopupWindow,主要就是增加菜单项的touch listener,完成菜单底色、按压色配置,提供接口onMenuItemSelected()完成点击事件响应

2. FreeToolbar:继承自LinearLayout,封装标题、导航按钮、溢出菜单的配置

3. ToolbarActivity:覆盖setContentView()方法通过addView()的方式添加FreeToolbar,然后提供两个新的生命周期方法onCreateFreeToolbar()onCreateOverflowMenu()供子类覆盖实现

示例代码下载(CSDN)

https://github.com/qianxin2016/FreeToolbar/

猜你喜欢

转载自blog.csdn.net/turkeycock/article/details/51837380